分析題意,可知有兩種情況:
所以對於該題,有兩種方法:
* 對於鍊錶問題,兩種通用解法的適用場景
* 方法一中調整陣列也可不用額外陣列,這便是**完美洗牌**問題
* 方法二鍊錶的具體調整方式
public
static
void relocate(node head)
arraylistlist = new arraylist<>();
node curnode = head;
while (curnode != null)
int num = new
int[list.size()];
if ((list.size() & 1) == 0)
for (int i = list.size() / 2; i < list.size(); i++)
}else
for (int i = list.size() / 2; i < list.size() - 1; i++)
num[list.size() - 1] = list.get(list.size() - 1);
}head.value = num[0];
node cur = head;
for (int i = 1; i < num.length; i++)
}
public
static
void
relocate(node head)
//定義快慢指標找到中間位置
// 1 -> 2 -> 3 -> 4,最終mid停在2處
// 1 -> 2 -> 3 -> 4 -> 5,最終mid依舊停在2處
node slow = head;
node fast = head.next;
while (fast.next != null && fast.next.next != null)
node mid = slow;
//分成左右兩個鏈,如 左鏈是 1 -> 2,右鏈是3 -> 4 -> 5
node rhead = slow.next;
mid.next = null;
node lhead = head;
//乙個乙個合併兩鏈,最終形成 1 -> 3 -> 2 -> 4 -> 5
mergelist(lhead, rhead);
}//合併兩鏈函式,注意:兩鏈不是空鍊錶,至少乙個元素(適用於 兩鏈長度關係什麼都行的情況,該題中左鏈 <= 右鏈)
/* * 1 2 3
* 4 5 6 7
* 連線順序為 4連2,1連4,這是一次迴圈,然後5連3,2連5,這又是一次迴圈
* 然後退出迴圈,3連6
*/public
static
void
mergelist(node lhead, node rhead)
lcur.next = rcur;
}
鍊錶 鍊錶環問題總結
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...
LeetCode 反轉鍊錶(鍊錶問題)
難度 簡單 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null使用三個listnode,分別是prev,curr,next。curr是當前指標指向的節點,prev是curr的前乙個節點,頭節點的前乙個節點是null,next是curr的下乙個節點,用於遍歷鍊...
鍊錶問題(二) 有序鍊錶合併
已知兩個鍊錶head1和head2個字有序,請把他們合併成乙個鍊錶依然有序 包含所有結點,即便大小相同 struct node 方法一 遞迴實現 node merge node head1,node head2 else return head 方法二 迴圈實現 node merge node he...