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小的結點,另乙個鍊錶儲...