1.问题描述:给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
2.思路:首先要定义一个头指针并且要在头指针的前面加一个dummy,用来储存头指针,并且一定要把dummy赋值给head。这样如果删除的是第一个元素,还有保存头节点的dummy可以返回删除头节点后的链表。另外再定义length来计算链表中节点数,再从头节点开始遍历链表一直到要删除节点的前一个节点,再把该节点的next指向它的next的next,这样就把要删除节点删除了,最后用dummy->next返回头节点即可返回删除指定节点后的链表。
3.代码:
/**
* 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
ListNode *p;
ListNode *dummy=new ListNode(0);
dummy->next=head;
head=dummy;
p=head;
int length=0;
while(p!=NULL)
{ p=p->next;
length++;
}
for(int i=1;i<length-n;i++)
{ head=head->next;
}
head->next=head->next->next;
return dummy->next;
}
};
4.感想:这个程序比前几个链表的程序要复杂得多,并且当给定的样例调通的时候,发现1->NULL并不能调通!加上head=dummy就正确了!