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