题19、删除链表的倒数第N个节点

一、题目1

在这里插入图片描述

二、思路

将当前循环节点的前n个节点存储下来,在遍历完成之后直接进行处理。

注意:1、长度为0,1;2、删除节点为第一个、倒数第一个、第二个、倒数第二个;特殊情况的处理。

三、代码

public class T0019 {

    public static void main(String[] args) {

        int[] nums = {1,2,3,4,5};
//        int[] nums = {1};

        ListNode head = new ListNode(nums[0]);
        ListNode node = head;

        for ( int i = 1; i < nums.length; i++ ){
            node.next = new ListNode(nums[i]);
            node = node.next;
        }

        node = removeNthFromEnd( head, 5);

        while ( node != null ){
            System.out.println(node.val);
            node = node.next;
        }

    }

    public static ListNode removeNthFromEnd(ListNode head, int n) {

        //对一个不删除,输入为空,只输入一个节点的情况进行处理
        if ( n == 0 || head == null )
            return head;
        else if ( head.next == null )
            return null;
        
        ListNode node = head;           //用于迭代
        ListNode bfRemove = head;       //存储当前迭代的节点的前n个节点

        int count = 0;                  //当前是第几个节点了
        while ( node != null ){
            count++;
            
            //在当前节点有前n个节点之时对bfRemove进行迭代
            if ( count > n+1 ){
                bfRemove = bfRemove.next;
            }
            node = node.next;

        }
//        System.out.println( bfRemove.val  + "\t" + count);
        
        //对删除的节点是头结点这种特殊情况的处理
        if ( count == n ){
            bfRemove.val = bfRemove.next.val;
        }

        bfRemove.next = bfRemove.next.next;

        return head;
    }
}

//Definition for singly-linked list.
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

发布了48 篇原创文章 · 获赞 1 · 访问量 850

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/104172735