题目要求:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
说明:给定的 n 保证是有效的。
分析:可以使用前面寻找倒数第K个节点的方法,但是找到之后还要找到倒数第K-1个节点;
注意边界条件,删除的节点是头节点的时候还有只有一个节点的时候!
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head)
return NULL;
ListNode* pFront = head;
ListNode* pBack = head;
for(int i=0;i<n;i++) {
pFront = pFront->next;
}
while(pFront) {
pFront = pFront->next;
pBack = pBack->next;
}
if(pBack == head)
return pBack->next; //删除的节点是头节点的话,返回下一个节点
ListNode* pPre = head;
while(pPre->next != pBack && pPre->next != NULL)
pPre = pPre->next;
if(pPre->next == pBack->next && pPre->next == NULL)
return NULL; //如果删除的链表只有一个节点的话,返回null
pPre->next = pBack->next;
delete pBack;
return head;
}
};