给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
注意事项:链表中的节点个数大于等于n
样例
给出链表1->2->3->4->5->null和 n = 2.
删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.
思路:题目是在在“[LintCode]166.链表倒数第n个节点”的基础上增加功能,我们已经有了寻找倒数第n个节点的方法。删除节点k参考“
[LintCode]452.删除链表中的元素
” ,关键在于要找到k的前一个节点,其次就是特殊情况的判断 : 要删除的节点在头部,要删除的节点在中间、尾部
/**
* 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) {
if(head==NULL||n<1){
return NULL;
}
ListNode *p=head;
ListNode *pre=head;//倒数第n个节点
while(--n){ //快指针p提前n个单元
if(p->next==NULL){
return NULL;
}else{
p=p->next;
}
}
ListNode *t;
while(p->next){
p=p->next;
t = pre; //标记倒数第n个节点的前一个节点
pre=pre->next;
}
//找到倒数第n个节点pre后,删除节点
//关键判断:如果只有一个节点,倒数第n个就是第一个,删除后链表为空
if ( pre == head){
head = head -> next; //要删除的节点在头部
} else {
t->next = t->next->next;//要删除的节点在中间、尾部,遍历链表删除
}
return head;
}
};