【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. 連結串列的中間結點
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 演算法題中的連結串列演算法
- javascript中的連結串列結構—雙向連結串列JavaScript
- 演算法-連結串列演算法
- 連結串列的作用和好處?如何用JS來寫一個連結串列JS
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 把玩演算法 | 連結串列演算法
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 帶頭結點的連結串列操作題
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- 演算法面試(一) 連結串列演算法面試
- 初級演算法-連結串列演算法
- 力扣--連結串列演算法力扣演算法
- 筆記--連結串列演算法筆記演算法
- 資料結構與演算法-連結串列資料結構演算法
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 連結串列入門與插入連結串列
- (連結串列)連結串列的排序問題排序
- [演算法]向有序的環形單連結串列中插入新節點演算法
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- 【小白學演算法】5.連結串列(linked list)、連結串列的新增演算法
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 連結串列
- 程式碼隨想錄演算法訓練營第四天 | 連結串列 24.兩兩交換連結串列中的節點 19.刪除連結串列的倒數第N個節點 142.環形連結串列II演算法
- 資料結構與演算法分析——連結串列資料結構演算法