2017-04-09 52 views
-1

給定一個整數值和一個指向鏈表頭的指針,如何從列表中刪除所有大於指定值的節點?從鏈表中刪除大於指定值的節點

例如

列表:10-> 34-> 11-> 19-> 26-> 55-> 17 值:19 輸出:10-> 11-> 17(所有大於19的節點需要移除)

(邊緣的情況下)

列表:10-> 3-> 17-> 5-> 2-> 14-> 7 值:9 輸出:3-> 5-> 2-> 7(所有節點大於9需要刪除)

我不是在尋找確切的代碼,只是一個算法來解決這個問題!

+1

'std :: list :: remove_if' http://en.cppreference.com/ W/CPP /容器/列表/刪除 –

+0

我不需要stl實現...但我正在尋找一種算法來實現它自己! –

+0

請解釋你爲什麼不使用'std :: list'?如果這是一項任務,那麼請顯示您迄今嘗試的內容。 –

回答

1

 考慮這裏的圖片。假設我們必須刪除大於8的節點。首先我們將兩個指針temp1和temp2都指向最初的頭部。然後通過指針我們將遍歷列表並檢查temp1將跟蹤臨時temp2之前的一個節點,因爲temp2.​​number大於8 temp1將指向temp2指向的下一個節點並刪除節點temp2 node.By遍歷所有節點並按照此規則可以刪除列表的指定節點.... 我希望你明白了........

+0

你可以請詳細說明它的示例代碼? –

1

第一分配臨時節點到起始節點
然後,你必須三種情況鏈表 ..
如果在第一位置所需的節點,然後作出啓動等於start->next和刪除臨時節點
如果它在中間,則使另一個節點在temp之前立即停止,並使該節點的下一個等於下一個temp,然後如果它處於最後位置,則使其之前的節點的下一個成爲等於nullptr就是這樣。

0
private static Node removeNodes(Node start, int x) { 

if(start == null) return start; 

if(start.data > x && start.next == null) return null; 

//find first head node 
Node cur = start; 
Node prev = null; 

//4,5,3,2,1,6 --- where x = 2 
while(cur != null && cur.data > x) { 
    prev = cur; 
    cur = cur.next; 
} 

if(prev != null) prev.next = null; 

Node newHead = cur; 

while(cur.next != null) { 
    if(cur.next.data > x) { 
     cur.next = cur.next.next; 
    } else { 
     cur = cur.next; 
    } 
} 

return newHead; 
}