題目如下:
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
解題思路:
1、計算鏈表的長度,刪除倒數第n個,就是刪除倒數第len%n個節點
2、快慢指針均指向頭結點,慢指針在頭結點處不動,快指針向後走n個節點
3、如果此時快指針指向空,就是意味着要刪除的是第一個結點,return head->next,即完成刪除操作
4、如果此時快指針不爲空,那麼快慢指針開始一起向後走,直到快指針到達最後一個節點位置,此時的慢指針指向的就是要刪除結點的前驅結點了
ListNode *removeNthFromEnd(ListNode *head, int n)
{
if (head == NULL || n <= 0)
return head;
ListNode *p = head;
ListNode *q = head;
int len = 0;//定義len記錄鏈表的長度
while (p != NULL)//計算鏈表的長度
{
len++;
p = p->next;
}
n = n % len;//求出最簡n
p = head;//p回到頭結點
while (p != NULL && n--)//p往後走n個結點
{
p = p->next;
}
if (p == NULL)//說明要刪除的那個結點是第一個結點
return head->next;
while (p->next != NULL)//p,q一起往後走
{
p = p->next;
q = q->next;
}
q->next = q->next->next;//刪除結點
return head;//返回頭結點即返回新鏈表
}
代碼運行圖如下: