算法通关村第一关—链表经典问题之删除链表的倒数第 N 个结点笔记
源码地址:GitHub-算法通关村
题目地址:LeetCode
解题思路:
- 创建一个虚拟头节点
dummyHead
,将其next
指针指向链表的头节点head
。这样做是为了方便处理头节点的删除情况。 - 初始化两个指针
slow
和fast
,slow
指向虚拟头节点dummyHead
、fast
指向头结点head
。 - 移动
fast
指针,使其先走 N 步。这样,fast
和slow
之间就相隔 N 个节点。 - 然后,同时移动
fast
和slow
指针,直到fast
指针指向链表末尾(即fast
为null
)。 - 此时,
slow
指针指向倒数第 N+1 个节点。 - 修改
slow.next
指针,使其指向倒数第 N+1 个节点的下一个节点,即跳过倒数第 N 个节点,从而实现删除倒数第 N 个节点。 - 返回虚拟头节点的
next
指针,即为最终的链表头节点,表示完成删除操作后的链表。
/**
* 删除链表的倒数第 N 个结点
*
* @param head
* @param n
* @return
*/
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode slow = dummyHead;
ListNode fast = head;
while (n > 0) {
fast = fast.next;
n--;
}
while (fast != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummyHead.next;
}