Java如何對一條單向鏈表進(jìn)行插入排序
給定一條單向鏈表,我們需要對其進(jìn)行插入排序,并返回一個(gè)有序的鏈表。同時(shí),我們需要滿足原地操作的約束,即空間復(fù)雜度為O(1)。圖示鏈表節(jié)點(diǎn)定義首先,我們聲明一個(gè)靜態(tài)內(nèi)部類,用于表示鏈表節(jié)點(diǎn),以便構(gòu)建一條
給定一條單向鏈表,我們需要對其進(jìn)行插入排序,并返回一個(gè)有序的鏈表。同時(shí),我們需要滿足原地操作的約束,即空間復(fù)雜度為O(1)。
圖示鏈表節(jié)點(diǎn)定義
首先,我們聲明一個(gè)靜態(tài)內(nèi)部類,用于表示鏈表節(jié)點(diǎn),以便構(gòu)建一條鏈表結(jié)構(gòu)。
```java
public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
val;
}
}
```
插入排序算法實(shí)現(xiàn)
接下來,我們實(shí)現(xiàn)基于單向鏈表的插入排序算法。算法思想如下:
1. 由于鏈表無法像數(shù)組一樣隨機(jī)訪問,對于每個(gè)節(jié)點(diǎn),我們需要從頭開始遍歷鏈表,找到合適的位置進(jìn)行插入。
2. 由于需要調(diào)換節(jié)點(diǎn)的位置,我們需要在節(jié)點(diǎn)的前導(dǎo)節(jié)點(diǎn)基礎(chǔ)上進(jìn)行操作。因此,我們創(chuàng)建一個(gè)虛擬頭節(jié)點(diǎn)作為原始鏈表的前導(dǎo)節(jié)點(diǎn)。
```java
public ListNode insertionSortList(ListNode head) {
if (head null || null) {
return head;
}
ListNode dummy new ListNode(Integer.MIN_VALUE); // 虛擬頭節(jié)點(diǎn)
head;
ListNode curr head;
ListNode prev dummy;
while (curr ! null) {
if ( < ) {
ListNode temp dummy;
while ( ! null < ) {
temp ;
}
ListNode next ;
;
curr;
curr next;
} else {
curr ;
prev ;
}
}
return ;
}
```
輔助函數(shù):鏈表轉(zhuǎn)字符串
我們編寫一個(gè)輔助函數(shù),用于將鏈表結(jié)構(gòu)轉(zhuǎn)換為一個(gè)字符串,以便進(jìn)行本地測試。
```java
public String listToString(ListNode head) {
StringBuilder sb new StringBuilder();
ListNode curr head;
while (curr ! null) {
().append(" -> ");
curr ;
}
("null");
return ();
}
```
本地測試
接下來,我們編寫一個(gè)主方法用于進(jìn)行本地測試,并觀察控制臺輸出結(jié)果是否符合預(yù)期。
```java
public static void main(String[] args) {
Solution solution new Solution();
ListNode head new ListNode(4);
new ListNode(2);
new ListNode(1);
new ListNode(3);
ListNode sortedList (head);
((sortedList));
}
```
運(yùn)行本地測試主方法,觀察控制臺輸出結(jié)果。如果和預(yù)期結(jié)果相符,則說明本地測試通過。
提交算法并進(jìn)行測試
最后,我們將代碼提交到平臺上進(jìn)行測試。如果通過了平臺的測試,那么我們的算法實(shí)現(xiàn)是正確的。
以上就是Java如何對一條單向鏈表進(jìn)行插入排序的相關(guān)內(nèi)容。通過使用插入排序算法,我們可以在原地操作的情況下,對單向鏈表進(jìn)行排序,并返回一個(gè)有序鏈表。