Skip to content

Latest commit

 

History

History
56 lines (42 loc) · 1.34 KB

20200519-删除链表的倒数第N个节点 .md

File metadata and controls

56 lines (42 loc) · 1.34 KB

每天一道leetCode

信息卡片

题目描述

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

示例:

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

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

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

参考答案

两次遍历

  • 第一次找到链表总长度, 第二次删除

快慢指针

  • 构造两个指针,快指针比慢指针先走n + 1步,然后一起向后移动知道快指针到达终点,即可保证慢指针是倒数第n位
  • 注意这里dummy节点的使用
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode fast = dummy;
        ListNode slow = dummy;
        for(int i = 1; i <= n + 1; i++) {
            // 快指针先走n+1步, 题目保证n有效,因此不需要检验
            fast = fast.next;
        }
        while(fast != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }
}