题目描述:给定一个链表,要求从尾部移除第N个结点,返回头指针。
解题注意点:
1、给定的链表头指针可能为空,要判空,直接返回;
2、如果给定的链表只有一个元素,而且要删除的第一个结点的话,那么直接返回空;
3、若前两条都不满足,则设置两个指针p,q,都指向头结点。
指针p先往前走N个结点。
这时,如果p已经到了链表尾部(p==NULL),那么说明要删除的是头结点,那么更改头结点,并且返回。
否则,p跟q一起往前走,直到p走到头为止(p->next!=NULL)。
删除q下一个位置的结点,即q->next=q->next->next。返回头结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
if(head==NULL || n<=0) return head;
if(head->next==NULL && n==1) return NULL; //one element
ListNode *p, *q;
p=q=head;
for(int i=1; i<=n; i++)
{
p=p->next;
}
if(p==NULL ) {head=head->next; return head;} //如果是头结点被删除
while(p->next!=NULL)
{
p=p->next;
q=q->next;
}
q->next=q->next->next;
return head;
}
};