题目的要求是移除倒数第n个结点,那么首先从头结点开始遍历,遍历n次,此时这个结点(成为e结点)和头结点的距离就为n,这是从e节点和头结点 同时开始遍历,那么当e结点遍历到尾部的时候,从头结点开始遍历的那个节点就为倒数第n个结点。
要处理的一个边界情况是,当n恰好等于链表的长度的时候,也就是要移除第一个结点,这时候要把head至为head->next,并返回
(discuss中一个消除边界情况的方法:新建一个结点并申请内存,将该节点的next域指向head)
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *end = head;
struct ListNode *cur = head;
int i = 0;
//find before end
for (i; i < n; i++)
{
cur = cur ->next;
}
if (cur == NULL)
return head ->next;
while (cur ->next != NULL)
{
cur = cur ->next;
end = end ->next;
}
cur = end ->next;
end ->next = cur ->next;
free(cur);
cur = NULL;
return head;
}