Remove Nth Node From End of List 从链表中删除元素

来源:互联网 发布:甘肃省公务员网络培训 编辑:程序博客网 时间:2024/06/06 06:39

Given a linked list, remove the nth node from the end of list and return its head.

For example,

 Given linked list: 1->2->3->4->5, and n = 2.   After removing the second node from the end, the linked list becomes 1->2->3->5.

从链表中删除,以链表尾部开始数过来的第n个数。

我们利用双指针策略,fast指针和slow指针。这样只要遍历一次链表,就可以完成删除。

1. fast指针先走 n 步后,

2. fast指针和slow指针一起走,直至fast.next = null

3. 当fast.next = null的时候,此时slow 在 3这个地方

    slow.next = slow.next.next就可以把4消除掉了。

唯一需要注意的问题:

当fast先走n步后= null了。(此时如果再判断fast.next会报指针错误的)

我们思考: fast走n 步后为null意味着什么呢?

此时slow 指向 head, 意味着我们要删除head 了 !


运行时间:



代码:

    public ListNode removeNthFromEnd(ListNode head, int n) {        if (n == 0 || head == null) {            return head;        }        ListNode fast = head, slow = head;        for (int i = 0; i < n; i++) {            fast = fast.next;        }        // need to delete the head;        if (fast == null) {            return head.next;        }        while (fast.next != null) {            fast = fast.next;            slow = slow.next;        }        slow.next = slow.next.next;        return head;    }


1 0