代码写的很挫,交了挺多次。以后写代码 一定要先把左右的情况 都考虑清楚 再考虑敲代码。哎
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode thead=head,nhead=head;if(head==null)
return head;
int i=0;
while(head.next!=null){
head=head.next;
i++;
if(i>n)
nhead=nhead.next;
}
if(i==0)//判断就一个节点的情况
return null;
else if(n==1)//判断移除最后一个节点的情况
nhead.next=null;
else if(i==n-1)//判断移除第一个节点的情况
return nhead.next;
else
nhead.next=nhead.next.next;
return thead;
}
别人的文章:
思路:
两个指针,p先走n步,然后q开始走。当p走到末尾时,q正好到了待删除节点。
- #include <iostream>
- using namespace std;
- struct LinkNode
- {
- int data;
- LinkNode *next;
- LinkNode(int x):data(x),next(NULL){}
- };
- LinkNode * removeNthNodeFromEnd(LinkNode *head,int n)
- {
- if(head == NULL || n == 0)//防御性编程,增加健壮性
- return head;
- LinkNode *dummy = new LinkNode(-1);
- dummy->next = head;
- LinkNode *p,*q,*tmp;
- p = dummy;
- q = dummy;
- //p先走n步
- for(int i=0;i<n;i++)
- {
- if(p->next != NULL)
- p = p->next;
- else
- return head;//如果n超过链表的长度,直接返回head
- }
- //然后p,q一起走
- while(p->next)
- {
- p = p->next;
- q = q->next;
- }
- //此时q指向的是待删除节点的前驱
- tmp = q->next->next;
- delete q->next;
- q->next = tmp;
- head = dummy->next;
- delete dummy;
- return head;
- }