給定乙個鍊錶,刪除鍊錶的倒數第 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 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?解題思路 這是一道簡單題。高階要求使用一趟掃瞄實現,雙...