一、题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶: 你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
二、解决
1、快慢指针法
思路:
类似【LeetCode-剑指Offer】22. 链表中倒数第k个节点,理解不难,重要的是细节,如走n步,还是n+1步。
代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
ListNode latter = dummy, former = dummy;
latter.next = head;
// Move former in front so that the gap between latter and former becomes n
for(int i=1; i<=n+1; i++) {
former = former.next;
}
// Move former to the end, maintaining the gap
while(former != null) {
latter = latter.next;
former = former.next;
}
// Skip the desired node
latter.next = latter.next.next;
return dummy.next;
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)