【Algorithm】連結串列演算法中啞結點作用
題目描述
Sort a linked list using insertion sort.
一般思路(直接在原連結串列上進行插排)
很好理解,就是遍歷每個結點cur,同時記錄其前一個結點pre。
如果碰到某個cur的值小於pre,從頭結點開始遍歷,直到找到應該插入的位置。
不使用啞結點的問題就是多判斷了一個cur要替換頭結點,頭結點往後移的狀況,這時不能用遍歷的程式碼
需要額外寫一種情況
if(head.val > cur.val){
cur.next = head;
head = cur;
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public static ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null)return head;
for(ListNode pre = head; pre.next != null; ){
ListNode cur = pre.next;
if(cur.val < pre.val){
pre.next = cur.next;
ListNode p = head;
ListNode c = p.next;
if(head.val > cur.val){
cur.next = head;
head = cur;
}else {
//將cur從head遍歷到其應該插入的地方(大於前者p小於後者c.next)
while(c != cur && c != null){
//頭結點額外判斷
if(c.val > cur.val){
p.next = cur;
cur.next = c;
break;
}
p = c;
c = c.next;
}
}
}else pre = pre.next;
}
return head;
}
}
使用啞結點
大致思路其實是一致的,但是他新建了一個啞結點作為“新的連結串列”(其實就建了一個結點)。
這樣就不可能有替換頭結點的情況了,因為頭結點的值為Integer.MIN_VALUE。
*和啞結點沒關係的地方:查詢插入位置的時候用的是pre.next,而不是像上面維護兩個指標p/h來查詢插入位置。
**也就是pre代表了p,pre.next代表了h,verygood。
public static ListNode insertionSortList(ListNode head) {
//啞結點
ListNode dummy = new ListNode(Integer.MIN_VALUE);
ListNode pre = dummy;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
pre = dummy;
while(pre.next != null && pre.next.val < cur.val){
pre = pre.next;
}
cur.next = pre.next;
pre.next = cur;
cur = next;
}
return dummy.next;
}
}
相關文章
- 結點插入到單連結串列中
- 連結串列中環的入口結點
- 876. 連結串列的中間結點
- 【連結串列問題】刪除單連結串列的中間節點
- 演算法題中的連結串列演算法
- 演算法-連結串列演算法
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- 連結串列的作用和好處?如何用JS來寫一個連結串列JS
- JZ-055-連結串列中環的入口結點
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 把玩演算法 | 連結串列演算法
- 連結串列 - 單向連結串列
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列4: 迴圈連結串列
- 連結串列-雙向通用連結串列
- 連結串列-單連結串列實現
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 【小白學演算法】5.連結串列(linked list)、連結串列的新增演算法
- 特定深度節點連結串列
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 資料結構與演算法-連結串列資料結構演算法
- 連結串列倒數第k個結點
- 尋找連結串列相交結點問題
- 初級演算法-連結串列演算法
- 力扣--連結串列演算法力扣演算法
- 55-將單連結串列原地逆置(有頭結點的單連結串列)
- LeetCode每日一題:連結串列的中間結點(No.876)LeetCode每日一題
- JZ-056-刪除連結串列中重複的結點
- 劍指offer——連結串列中倒數第k個結點
- 資料結構-單連結串列、雙連結串列資料結構
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列