146-刪除鏈表倒數N個節點

題目如下:
給定一個鏈表,刪除鏈表的倒數第 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;//返回頭結點即返回新鏈表 
}

代碼運行圖如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章