我做的还是最简单粗暴的做法,因为想不出简单算法,也不知道怎么只用一个loop。。
于是用c,
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* H;
H=head;
int len=1;
while(H->next!=NULL)
{
len++;
H=H->next;
}
int pos=len-n,num=1;
if(n==len)
{
head=head->next;
return head;
}
H=head;
while(num!=pos)
{
num++;
H=H->next;
}
H->next=H->next->next;
return head;
}
然后看了discuss,发现巧妙的办法,用两个指针,通过他们之间的差值来确定。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (!head) return head;
ListNode dummy(0), * t = &dummy, *s = &dummy;
dummy.next = head;
while (t && t->next) {
if (n-- <= 0) s = s->next;
t = t->next;
}
s->next = s->next->next;
return dummy.next;
}
};
ps,以后写链表的程序,最好先定义一个头指针,即
ListNode dummy(0),*t=&dummy;
dummy.next=head;
然后最后返回值为dummy.next即可。