鍊錶的中間節點 移除鍊錶元素

2021-09-12 09:48:34 字數 1380 閱讀 3968

鍊錶的中間節點

給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。

示例 1:

輸入:[1,2,3,4,5]

輸出:此列表中的結點 3 (序列化形式:[3,4,5])

返回的結點值為 3 。 (測評系統對該結點序列化表述是 [3,4,5])。

注意,我們返回了乙個 listnode 型別的物件 ans,這樣:

ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = null.

示例 2:

輸入:[1,2,3,4,5,6]

輸出:此列表中的結點 4 (序列化形式:[4,5,6])

由於該列表有兩個中間結點,值分別為 3 和 4,我們返回第二個結點。

這裡我們可以使用雙指標來實現;及乙個快指標(一次迭代跨越兩個節點)與乙個慢指標(一次迭代跨越乙個節點)當快指標進行到單鏈表的末尾時,慢指標剛好進行到了整個鍊錶的的一般,但注意示例2要求我們在偶數節點時返回靠後的那個中間節點,這時我們需要將塊指標的步驟查分開來,將慢指標穿插其中,在快指標第二次前進時再進行一次判斷;

struct listnode*

middlenode

(struct listnode* head)

}return low;

}

移除鍊錶元素
刪除鍊錶中等於給定值 val 的所有節點。

示例:輸入: 1->2->6->3->4->5->6, val = 6

輸出: 1->2->3->4->5

這裡與之前反轉鍊錶三指標法的思路有點相似,都是建立乙個prev變數來儲存前乙個節點,當前節點中一旦含有目標值,則立刻使前節點指向之後的節點並且釋放當前節點,但這裡有乙個問題我們需要注意:若直接使用這種方式當第乙個節點便含有目標數時,此時prev等於null,當之後我們訪問prev的成員時便會出錯,這裡我採用的方法是從第二個節點開始檢測,這樣prev節點一開始就賦成首節點,當檢測完後我們再單獨處理首節點:

struct listnode*

removeelements

(struct listnode* head,

int val)

struct listnode* last = head;

struct listnode* go = head->next;

while

(go !=

null

)else}if

(head->val==val)

return head;

}

移除鍊錶元素

刪除鍊錶中等於給定值 val 的所有節點。示例 輸入 1 2 6 3 4 5 6,val 6 輸出 1 2 3 4 5 兩個引用,乙個指向頭結點,乙個指向頭結點的下乙個結點,要考慮頭結點為null的情況。遍歷鍊錶,當遇見和val相等的數,就直接把它刪掉,好要考慮當第乙個節點就是要刪除的節點時,直接h...

鍊錶中間節點

題目 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode ...

LeetCode 鍊錶 鍊錶的中間節點

給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode 型別的物件...