19 刪除鍊錶的倒數第N個節點

2021-08-26 09:29:21 字數 2775 閱讀 8745

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。

示例:

給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.

說明:給定的 n 保證是有效的。

高階:你能嘗試使用一趟掃瞄實現嗎?

說實話,就我的水平而言感覺這道題坑點還真不少,先來我的乙個粗糙版本的!!!

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* removenthfromend(struct listnode* head, int n)

struct listnode*pahead, *pafter, *pre;

//刪除節點考慮加頭指標

pahead = head;

if(n == 1)

if(pahead->next == null)

}//先讓pahead領先pafter (n-1)個位置

for(int i = 1; i < n ; i++)

pafter = head;

while(pahead->next != null)

if(pafter == head)

else

return head;

}

粗糙版考慮到以下幾點:

1. 對空鍊錶,單節點鍊錶和異常引數n進行處理預處理

2.演算法思想:設定pahead和pafter,讓pafter領先pahead(n-1)個節點,然後雙方同時後移,

直到pahead->next == null,那麼此時的pafter不就是倒數第n個節點了嗎???

然後pre = pafter;來儲存pafter前乙個節點,只要pre->next = pafter->next;      free(pafter);

就可以實現節點的刪除並釋放相應空間。

但是問題有哪些或者哪些方面可以優化呢?

首先,判斷條件太多,比如:

if(!head ||!head->next || n < 0)

...if(n == 1)

if(pahead->next == null)

}...

if(pafter == head)

為什麼要判斷n==1呢?很明顯多此一舉吧?

但是其實是有原因的,因為pahead領先pafter(n-1)個位置,所以如果n=1的話,那麼pahead就和pafter同步了,這不是我們要的。此時大家有沒有想起帶【頭結點】的單鏈表呢?

對的,有頭結點的單鏈表使得我們對節點的插入和刪除省略很多特殊處理,這裡同樣如此,

所以我們優化的乙個方向就是加頭節點!!!

聰明的讀者也許會問為什麼pahead要領先pafter (n-1)個節點呢?

直接領先n個不就可以了嗎?到時候只要判斷pahead是不是null就好,何必判斷pahead->next == null呢?

對的,我認為你說的有道理,所以,我先按照這兩點進行優化,然後正確跑通的c語言**是這樣的:

struct listnode* removenthfromend(struct listnode* head, int n) 

struct listnode*pahead, *pafter, *pre;

struct listnode *l = (struct listnode *)malloc(sizeof(struct listnode));

l->next = head; //刪除節點常用手段考慮加個頭指標

//先讓pahead領先pafter n個位置

pahead = pafter = l;

for(int i = 1; i <= n ; i++)

while(pahead != null)

pre->next = pafter->next;

free(pafter);

return l->next;

}

看上去**就簡潔了很多,而且這樣解決問題更直觀,不需要考慮太多特殊情況。

我這種經常容易出bug的人還是希望寫的**越簡潔越安全更好!!!

其實主要是加了乙個頭節點!!!

頭節點是放在第乙個元素節點頭部的節點,它只有指標域是有意義的,

首元節點指的才是第乙個元素節點!!!

listnode* findkthtotail(listnode* plisthead, unsigned int k)

}pbehind = plisthead;

while(pahead->m_pnext != nullptr)

return pbehind;

}

19 刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?class solution def removenthfrom...

19 刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第n個節點,並且返回鍊錶的頭結點。給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.給定的n保證是有效的。首先遍歷得出鍊錶的長度l,然後刪除第l n個節點 definition for singly linked list....

19 刪除鍊錶的倒數第N個節點

題目描述 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?解題思路 這是一道簡單題。高階要求使用一趟掃瞄實現,雙...