题目:去掉单链表中倒数第n个结点
分析:要只走一趟,用2个指针一起走。
答案:
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
if (head == NULL)
return NULL;
ListNode *pPre = NULL;
ListNode *p = head;
ListNode *q = head;
for(int i = 0; i < n - 1; i++)
q = q->next;
while(q->next)
{
pPre = p;
p = p->next;
q = q->next;
}
if (pPre == NULL)
{
head = p->next;
delete p;
}
else
{
pPre->next = p->next;
delete p;
}
return head;
}
};
还是有一些细节要注意,如一下就是错误的:
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *p = head;
ListNode *q = head;
// q first go n
for (int i = 0; i < n; i++)
{
q = q->next;
}
// p, q go together
while (q->next != NULL)
{
q = q->next;
p = p->next;
}
ListNode * deletedNode;
deletedNode = p->next;
p->next = p->next->next;
delete deletedNode;
return head;
}
};