概要
双指针向右走,右指针走到头,用左指针处理倒数第n个节点
题目
给定一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
链接:https://leetcode.cn/problems/SLwz0R/
思路
终于是进入了链表阶段。
因为是链表,所以我们不知道链表的长度。这题很经典,如果是头铁去找倒数第n个节点,那就先遍历一遍得到长度,然后重新遍历或者从后往前走。
当然,这里还是要祭出我们的双指针法。从链表头节点开始,右指针先出发,走了距离n之后,左指针和右指针同时出发。当右指针走到结尾时,左指针的下一个位置就是倒数第n个节点。
另外,链表的题,经常会使用一个哨兵节点指向链表的head,大大的方便了我们的处理。
解法:哨兵节点+双指针
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
// 使用哨兵节点可以方便的处理移除的节点为head的情况
dummy.next = head;
ListNode left = dummy;
ListNode right = dummy;
int count = 0;
// 右指针走n步
while (right.next != null && count < n) {
right = right.next;
count++;
}
// 左右同时前进
while (right.next != null) {
right = right.next;
left = left.next;
}
// 移除节点
left.next = left.next.next;
return dummy.next;
}