卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

如何通過Java實(shí)現(xiàn)鏈表重排

在數(shù)據(jù)結(jié)構(gòu)和算法中,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu)之一。鏈表中的每個節(jié)點(diǎn)都包含一個指向下一個節(jié)點(diǎn)的引用。在某些情況下,我們需要對鏈表進(jìn)行重新排序以滿足特定需求。如何通過Java實(shí)現(xiàn)鏈表的重排呢?本文將會介紹

在數(shù)據(jù)結(jié)構(gòu)和算法中,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu)之一。鏈表中的每個節(jié)點(diǎn)都包含一個指向下一個節(jié)點(diǎn)的引用。在某些情況下,我們需要對鏈表進(jìn)行重新排序以滿足特定需求。如何通過Java實(shí)現(xiàn)鏈表的重排呢?本文將會介紹如何通過編寫算法來實(shí)現(xiàn)鏈表的首尾節(jié)點(diǎn)交錯鏈接。

1. 定義鏈表節(jié)點(diǎn)

為了構(gòu)建一條單向鏈表結(jié)構(gòu),我們需要定義一個內(nèi)部靜態(tài)類,表示鏈表節(jié)點(diǎn)。該節(jié)點(diǎn)應(yīng)該包含兩個屬性:val代表節(jié)點(diǎn)的值,next代表指向下一個節(jié)點(diǎn)的引用。

```java

static class ListNode {

int val;

ListNode next;

public ListNode(int x) {

val x;

next null;

}

}

```

2. 實(shí)現(xiàn)算法

接下來,我們來實(shí)現(xiàn)具體的算法。首先,獲取原始鏈表的中間節(jié)點(diǎn),并將鏈表分為前后兩半;其次,將后一半鏈表的節(jié)點(diǎn)反轉(zhuǎn);最后,將兩部分鏈表交錯鏈接為一條鏈表返回即可。

```java

public static void reorderList(ListNode head) {

if (head null || null) return;

// 通過快慢指針?biāo)惴ǎ@取鏈表中間節(jié)點(diǎn)

ListNode slow head, fast head;

while ( ! null ! null) {

slow ;

fast ;

}

ListNode middle ;

null;

// 將后一半鏈表的節(jié)點(diǎn)反轉(zhuǎn)

ListNode prev null, curr middle;

while (curr ! null) {

ListNode next ;

prev;

prev curr;

curr next;

}

// 將兩部分鏈表交錯鏈接為一條鏈表

ListNode first head, second prev;

while (second ! null) {

ListNode next1 , next2 ;

second;

next1;

first next1;

second next2;

}

}

```

3. 反轉(zhuǎn)鏈表

上述算法中,我們需要反轉(zhuǎn)后一半的鏈表。為了實(shí)現(xiàn)這一步操作,我們需要編寫一個函數(shù),通過遞歸調(diào)用,將一條鏈表的節(jié)點(diǎn)反轉(zhuǎn)。

```java

public static ListNode reverseList(ListNode head) {

if (head null || null) return head;

ListNode p reverseList();

head;

null;

return p;

}

```

4. 鏈表交叉鏈接

此外,在將兩條鏈表交錯鏈接為一條鏈表時,我們還需要編寫一個函數(shù),將長度相同或相差一個節(jié)點(diǎn)(第二條鏈表多一個節(jié)點(diǎn))的兩條鏈表交叉鏈接為一條鏈表。

```java

public static void mergeLists(ListNode l1, ListNode l2) {

while (l1 ! null l2 ! null) {

ListNode next1 , next2 ;

l2;

l1 next1;

l1;

l2 next2;

}

}

```

5. 編寫測試函數(shù)

為了驗證算法是否正確,我們可以編寫一個函數(shù),將一條鏈表結(jié)構(gòu)轉(zhuǎn)變?yōu)橐粋€字符串,用于輔助本地測試。

```java

public static String listToString(ListNode head) {

StringBuilder sb new StringBuilder();

while (head ! null) {

().append("->");

head ;

}

("null");

return ();

}

```

6. 運(yùn)行本地測試

最后,我們可以編寫并運(yùn)行本地測試方法,觀察控制臺輸出,符合預(yù)期則本地測試通過。

```java

public static void main(String[] args) {

ListNode head new ListNode(1);

new ListNode(2);

new ListNode(3);

new ListNode(4);

new ListNode(5);

("Original List: " listToString(head));

reorderList(head);

("Reordered List: " listToString(head));

}

```

7. 提交算法

經(jīng)過本地測試后,我們可以將算法提交到平臺進(jìn)行測試,測試通過即可完成鏈表重排的實(shí)現(xiàn)。

標(biāo)簽: