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

Posted Delta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表的倒数第N个节点相关的知识,希望对你有一定的参考价值。

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

一种方法是先计算链表的长度N,然后定位到第(N-n)个节点,删除节点(N-n+1)也即(倒数第n个节点)

代码如下:

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

        // 新建一个节点temp
        // temp.next = head可以保存链表的头结点
        // 也方便处理删除的是第一个节点(倒数第N个)
        ListNode temp = new ListNode(0);
        temp.next = head;
        int N = 0;
        // Get the length of the list
        while (head != null) {
            N++;
            head = head.next;
        }
        N = N-n;
        head = temp;
        // Locate the (N-n)th node
        while (N>0) {
            head = head.next;
            N--;
        }
        head.next = head.next.next;
        return temp.next;
    }

 

第二种方法是,使用两个指针,首先将第一个指针置于第二个的后n+1个节点处。再同时移动两个指针,当第一个指向链表末尾时,第二个指针指向第(N-n)个节点。

 

以n=2为例,即删除倒数第二个节点

指针2指向开始处,指针1与指针2相隔为(n+1)

同时移动指针1与2,当1指向null时,二指向倒数第(n+1)个节点。

代码如下:

    public static ListNode test(ListNode head, int n) {
        ListNode temp = new ListNode(0);
        temp.next = head;
        ListNode p = temp;
        ListNode q = temp;
        while (n+1>0) {
            q = q.next;
            n--;
        }
        while (q != null) {
            p = p.next;
            q = q.next;
        }
        p.next = p.next.next;
        return temp.next;
    }

 

 

 

 

 


以上是关于删除链表的倒数第N个节点的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 19. 删除链表的倒数第N个节点

leetcode -- 19 删除链表的倒数第N个节点

代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II

删除链表的倒数第N个节点(三种方法实现)

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

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