码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-04-26 01:05:44      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:时移   节点   lis   div   The   方法   inf   new   两个指针   

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

示例:

给定一个链表: 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个节点

标签:时移   节点   lis   div   The   方法   inf   new   两个指针   

原文地址:https://www.cnblogs.com/deltadeblog/p/8947307.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!