给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点
在链表中删除倒数第 n
个节点的任务可以通过双指针技术高效地解决。下面详细分析了这个方法的实现步骤和解题思路。
解题思路
-
创建虚拟头节点:使用一个虚拟头节点(dummy node)简化边界情况的处理,比如链表头节点被删除的情况。
-
初始化两个指针:用两个指针(
first
和second
)来遍历链表,确保它们之间的距离为n
。 -
同步移动指针:当
first
指针到达链表的末尾时,second
指针将位于要删除节点的前一个节点。这样可以直接删除目标节点。 -
删除目标节点:调整
second
指针的next
指向目标节点的下一个节点,并释放目标节点的内存。
C++核心代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
// 创建虚拟头节点,方便处理头节点被删除的情况
ListNode dummy(0);
dummy.next = head;
ListNode* first = &dummy;
ListNode* second = &dummy;
// 先移动 first 指针,使其与 second 指针之间的距离为 n 个节点
for (int i = 0;i<=n;i++){
first = first->next;
}
//同步移动两个指针
while(first){
first = first->next;
second = second->next;
}
//这个时候,要被删除的节点应该是second的后一个节点
ListNode* toDelete = second->next;
second->next = second->next->next;
delete toDelete;
return dummy.next;
}
};