原题地址(中等)
方法1—快慢指针
思路
这题典型的快慢指针。先用一个快指针走n步,然后两个指针再一起走,就可以顺利找出倒数第N个数。
处理链表题的一个小技巧是建立一个虚拟头结点dummyHead,这样可以把对头结点的操作和对其他结点的操作统一起来
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *p, *q, *pre;
q = dummyHead;
for(int i=0; i<n; i++)
q = q->next;
p = pre = dummyHead;
while(q) {
pre = p;
q = q->next;
p = p->next;
}
pre->next = p->next;
delete p;
return dummyHead->next;
}
};
时空复杂度
时间复杂度O(L),L为链表长度
空间复杂度O(1)