题目:
给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
注意事项
链表中的节点个数大于等于n
给出链表1->2->3->4->5->null和 n = 2.
删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.
这道题的思路十分奇特,那就是为了找倒数第n个结点,从第一个结点开始遍历,同时n--,然后T和Q再同时遍历,直到最后,Q->next就是倒数第n个结点。
代码:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @param n: An integer.
* @return: The head of linked list.
*/
ListNode *removeNthFromEnd(ListNode *head, int n) {
// write your code here
if(head==NULL)
return NULL;
if(n==0)
return head;
/*if(head->next==NULL)
return NULL;*/
ListNode *T=head;
ListNode *Q=head;
while(n>0)
{T=T->next;
n--;
}
if(T==NULL)
return head->next;
while(T->next!=NULL)
{T=T->next;
Q=Q->next;
}
ListNode *A=Q->next;
Q->next=A->next;
return head;
}
};
感想:我一开始的想法是从头开始遍历,先算出结点个数,再算出倒数第n个结点在正数的位数,再删掉这个结点,这样这个结点的前驱和后继也是十分清楚明了的,但是我写完这样的代码后,并不能过,是超时还是爆内存的原因忘了。然后我又想建立循环链表来解决它,但是我发现这样的话有和一开始的想法一样了,还是不行。至于这种算法也是在我想了好久未果后在其他博客上看到的,一开始还不信,自己拿了好多例子,又用数学证明后才自己又敲了出来。此外,这几道题我还总是忘了判断head==NULL等即极端情况。