LeetCode 鍊錶(一)

2021-09-28 21:53:59 字數 2774 閱讀 3941

1、 刪除鍊錶中等於給定值 「val」 的所有節點。

解題思路:先考慮特殊情況,當鍊表為空直接返回null,想要刪除指定元素則需遍歷一遍鍊錶,從第二個節點開始遍歷,如果從第乙個節點開始遍歷,第乙個節點的prev會出現空指標異常,此時建立兩個結點cur用於遍歷和prev用於刪除,如果cur的值等於val, 利用prev刪除cur,如果cur的值不等於val,則cur、prev都向後走一步,最後再回過頭來看head的值是否為val,最終返回煉表頭節點head。

//1.先刪非頭結點

linkednode prev = head;

linkednode cur=head.next;

while(cur!=null)else

}//2.再刪頭節點

2、反轉乙個單鏈表。解題思路:首先考慮兩種特殊情況,一是為空煉表時,直接返回null即可,二是當鍊表中只含有乙個元素時,不需要進行特殊處理返回head即可。下面處理普通情況,首先定義乙個新結點newhead作為反轉後鍊錶的頭結點,初始化為null,但不意味著指向null,再分別定義三個結點,cur指向頭結點,prev初始化為空,next儲存cur的下乙個結點。

把當前物件cur的下乙個指向prev,再將prev 賦值給cur,然後cur賦值為下乙個物件next,即可完成反轉操作,之後僅需迴圈重複該操作。

當next為空時意味著鍊錶結束(cur.next == null),此時的cur為反轉後鍊錶的頭結點即newhead,最終返回newhead得到反轉後的單鏈表。

//對於只有乙個元素的鍊錶,不需要處理

if(head.next=null)

//處理多個元素情況

listnode newhead=null;

listnode cur=head;

listnode prev=null;

while(cur!=null)

//翻轉指標指向

3、給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。解題思路:將頭結點head傳給size()函式,求得鍊錶長度,定義變數steps為長度一半即steps=size(head)/2,建立乙個新的結點指向頭結點cur,利用for迴圈使cur向後走steps次,最後返回cur即為鍊錶的中間結點。

public listnode middlenode(listnode head)

//總長度減去k即為需要走的步長

int offset=length-k;

listnode cur=head;

for (int i = 0; i < offset; i++)

return cur;

}public int size(listnode head)

return size;

}

5、 將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。解題思路:建立節點cur1,cur2分別遍歷兩個鍊錶,newhead為合併後鍊錶的頭部,newtail為合併後鍊錶的尾部,

如果l1的值小於l2則將l1元素新增至新鍊錶,並且newtail向後移動,同理,直到最後有一方結束,則將未結束的指直接合併至新鍊錶結尾,因為合併的是有序鍊錶,若一開始有一方鍊錶為空,直接返回不為空的即可。

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?head null 空鍊錶,回文,返回true head.next null 只有乙個節點的列表,回文,返回tru...

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路 利用快慢指標找到中間節點,當快指標走到末尾時,慢指標指向中間節點 交中間節點之後的節點進行鍊錶反轉 設定指標p1從h...

分隔鍊錶(鍊錶 LeetCode)

題目鏈結 給你乙個鍊錶和乙個特定值 x 請你對鍊錶進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5維護兩個鍊錶,乙個鍊錶儲存比x小的結點,另乙個鍊錶儲...