关键词 双指针
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode dummy;
dummy.next = head;
// 链表长度
int preWalkedSteps = 0;
// front指针从dummy开始先走k步
ListNode* front = &dummy;
// 注意front不能为空,需要指向链表的最后一个结点
while (preWalkedSteps < n && front && front->next) {
front = front->next;
preWalkedSteps ++;
}
ListNode* back= &dummy;
// back指针从dummy开始先走,front继续走
while (front && front->next) {
back = back->next;
front = front->next;
}
//如果preWalkedSteps == k 就找打要删除的点在back的下一个
//删除操作
if (preWalkedSteps == n) {
back->next = back->next->next;
}
return dummy.next;
}
};
时间复杂度O(N)空间复杂度 O(1)
将旧链表改造成带 dummy 结点的链表,方便删除 head 结点。
让指针指向链表最后一个结点的 while 语句的写法。
利用移动步数来判断链表长度与 k 的关系。