描述
本题是力扣的19. 删除链表的倒数第 N 个结点
考点
-
快慢指针/双指针
题解
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(-1, head);
ListNode *slow = dummyHead;
ListNode *fast = dummyHead;
while(n--){
fast = fast->next;
}
while(fast->next != nullptr){
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
思路
题目要求删除链表的倒数第 n 个结点
,这里需要使用快慢指针来完成这一操作
首先新建一个dummyHead
伪节点,链表操作必备;假设我们需要删除链表{1, 2, 3, 4}的倒数第2个节点,即节点3
画图比划一下,用fast
指针指向最后一个节点,用slow
指针指向倒数第n+1个节点(因为要删除倒数第n个节点)
然后将它们平移到初始位置,是不是一目了然了~
步骤清晰如下:
-
快慢指针都从
dummyHead
起始 -
快指针先走n步
-
快慢指针一起走,直到快指针到达最后一个节点,此时慢指针的下一个节点就是待删除节点
当然也可以不用快慢指针,使用老办法递归:
-
子问题与返回值:每次判断本节点是否应该被删除。若要被删除,则返回
next
值;若不需要被删除,返回自身实际上就是返回应该存在于链表的节点
-
递归语句顺序:递归方向分为一去一回,去方向到达临界点后返回;这里选择回方向操作,因为要计算倒数
-
临界点:节点为
nullptr
时返回,意味着nullptr
节点存在于链表
class Solution {
private:
int n;
ListNode* recursiveFunc(ListNode* head) {
if (head == nullptr) return nullptr;
head->next = recursiveFunc(head->next);
if (--n == 0) return head->next;
return head;
}
public:
ListNode* removeNthFromEnd(ListNode* head, int _n) {
n = _n;
return recursiveFunc(head);
}
};
更多
恭喜你完成本题!
你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/
仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!
看官若还满意,还请Star一下哟~
关注公众号峰狂算法
,获取最新的刷题指导呀~