1.暴力解法
暴力解法其实就很简单了两次循环,先把链表长度算出来。
然后算一下倒数第n个是整数第几个,
整一个变量n,每访问一个结点,n++一下。
2.一次循环
这个方法应该是最优解法
思路
- 两个指针fast和slow中间间隔了n-1个结点。
- 两个指针同步往前走
- 当fast->next==NULL也就是fast指向最后一个结点的时候
slow自然就指向倒数第n个结点了
这个方法只要一次循环就可以搞定
ListNode* removeNthFromEnd(ListNode* head, int n) {
//思路:
/*两个指针p和q,
*p先往前走n-1个单位,然后p,q一起往前走
*当p->next为null的时候,q自然就指向倒数第n个结点啦
*找到以后删除就行了
*/
ListNode *dummyNode = new ListNode;
dummyNode->next = head;
ListNode *p = dummyNode, *q = dummyNode;
ListNode *pre = dummyNode;//q针的前驱指针
while (n-- && p != NULL) {
p = p->next;
}
p = p->next;
//p指针多往前走一个单位,这样p和q之间就间隔了n个结点
//q最终就会指向n的前一个结点,即倒数第n-1个结点,这样方便删除
while (p != NULL) {
p = p->next;
q = q->next;
}
q->next = q->next->next;
return dummyNode->next;
}