Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list
becomes 1->2->3->5.
Note: Given n will always be valid. Try to do this in one pass.
分析:
这题算是双指针的一个常见做法,加上链表里面常见的细节处理。链表删除在于定位要删的节点,而且必须将指针放在删除节点前一个位置(单向链表而言)。所以我们可以用两个指针,固定间隔n,向尾部移动,当后指针到达底部,前指针的下一个就是需要操作的位置。代码如下:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *temphead = new ListNode(0);
temphead->next = head;
ListNode *p = temphead, *q = temphead;
int count = 0;
while (count < n && q->next != NULL) {
q = q->next;
count++;
}
while (q->next != NULL) {
q = q->next;
p = p->next;
}
p->next = p->next->next;
head = temphead->next;
return head;
}
注意的就是,如果删除的是第一个节点呢?所以我们通常加一个dummy node作为头结点,这里就是我的temphead,这点在链表处理里很常见。还有就是返回的时候不要返回head,head作为指针始终指向那个内存空间,如果你删除了head在temphead后的关系,也并不改变head索引整个链表的关系,如果你释放那块内存,返回的head就是个空指针,所以这里我把head指向了temphead的下一个,这才是修改后新链表的第一个节点。