Java詳解如何將一條單向鏈表按節(jié)點(diǎn)奇偶位置分解
給定一個(gè)單向無環(huán)鏈表,實(shí)現(xiàn)一個(gè)算法,按照鏈表節(jié)點(diǎn)奇偶位置分解為兩條鏈表,鏈接為一條鏈表后返回。編寫鏈表節(jié)點(diǎn)類我們首先需要編寫一個(gè)靜態(tài)內(nèi)部類來代表鏈表的節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)類包含一個(gè)值屬性和一個(gè)指向下一個(gè)節(jié)點(diǎn)
給定一個(gè)單向無環(huán)鏈表,實(shí)現(xiàn)一個(gè)算法,按照鏈表節(jié)點(diǎn)奇偶位置分解為兩條鏈表,鏈接為一條鏈表后返回。
編寫鏈表節(jié)點(diǎn)類
我們首先需要編寫一個(gè)靜態(tài)內(nèi)部類來代表鏈表的節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)類包含一個(gè)值屬性和一個(gè)指向下一個(gè)節(jié)點(diǎn)的引用。
```java
public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
val;
null;
}
}
```
實(shí)現(xiàn)算法
下面我們來實(shí)現(xiàn)按照奇偶位置分解鏈表的算法。具體步驟如下:
1. 創(chuàng)建兩個(gè)空節(jié)點(diǎn),作為原鏈表奇偶位置子鏈表的頭節(jié)點(diǎn)。
2. 遍歷原始鏈表,將節(jié)點(diǎn)按照奇偶位置分解并鏈接起來。
3. 將通過節(jié)點(diǎn)奇偶位置構(gòu)建的子鏈表鏈接為一條鏈表并返回。
```java
public ListNode splitListByOddEven(ListNode head) {
if (head null || null) {
return head;
}
ListNode oddHead new ListNode(0);
ListNode evenHead new ListNode(0);
ListNode odd oddHead;
ListNode even evenHead;
ListNode curr head;
boolean isOdd true;
while (curr ! null) {
if (isOdd) {
curr;
odd ;
} else {
curr;
even ;
}
curr ;
isOdd !isOdd;
}
;
null;
return ;
}
```
輔助函數(shù):將鏈表轉(zhuǎn)為字符串
為了方便測試程序,我們還需要編寫一個(gè)函數(shù),可以將一條單向無環(huán)鏈表轉(zhuǎn)變?yōu)橐粋€(gè)字符串,便于輸出鏈表。
```java
public String convertToString(ListNode head) {
StringBuilder sb new StringBuilder();
ListNode curr head;
while (curr ! null) {
().append(" -> ");
curr ;
}
("null");
return ();
}
```
本地測試主方法
我們還需要編寫一個(gè)本地測試方法,來驗(yàn)證我們的算法是否正確。
```java
public static void main(String[] args) {
Solution solution new Solution();
// 創(chuàng)建鏈表 1 -> 2 -> 3 -> 4 -> 5
ListNode head new ListNode(1);
ListNode node2 new ListNode(2);
ListNode node3 new ListNode(3);
ListNode node4 new ListNode(4);
ListNode node5 new ListNode(5);
node2;
node3;
node4;
node5;
("原鏈表:" (head));
ListNode result solution.splitListByOddEven(head);
("奇偶位置分解后的鏈表:" (result));
}
```
觀察輸出結(jié)果
運(yùn)行本地測試方法,觀察控制臺(tái)輸出,確保輸出符合預(yù)期。
提交算法
經(jīng)過本地測試驗(yàn)證,我們可以將算法提交到目標(biāo)平臺(tái)進(jìn)行測試。