題目描述
給你一個鏈表,刪除鏈表的倒數第 n 個結點,并且返回鏈表的頭結點。
進階:你能嘗試使用一趟掃描實現嗎?
示例 1:

image.png
輸入: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
題解
使用快慢指針的思路解題,快指針先走n步,然后再快慢指針同步走,直到快指針走到最后一個節(jié)點位置,則慢指針當前所處的位置即為要刪除節(jié)點的前一個節(jié)點。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
// 快指針先走n步
while (n-- > 0) {
fast = fast.next;
}
// 如果快指針已經到底,則表示要刪除第一個節(jié)點,則直接返回頭結點的下一個節(jié)點
if (fast == null) {
return head.next;
}
// 再快指針和慢指針同步走,直到快指針到最后一個節(jié)點,則slow當前所在的位置即為要刪除節(jié)點的前一個節(jié)點
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}