原题地址(中等)
方法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)
