我這樣做exercice:分區單鏈表
編寫代碼分區鏈表繞x的值,以使所有節點小於X來之前的所有節點大於或等於x。輸入示例:3→5→8→5→10→2→1輸出:3→1→2→10→5→5→8
我發現很難找到單鏈表的解決方案(由我自己創建,而不是使用庫),我想知道在我的代碼中是否有不必要的代碼塊,並且有沒有辦法避免放入兩個列表然後合併?因爲它似乎有非常緩慢的表現。
public CustomLinkedList partition(CustomLinkedList list, int x) {
CustomLinkedList beforeL = new CustomLinkedList();
CustomLinkedList afterL = new CustomLinkedList();
LinkedListNode current = list.getHead();
while (current != null) {
if (current.getData() < x) {
addToLinkedList(beforeL, current.getData());
} else {
addToLinkedList(afterL, current.getData());
}
// increment current
current = current.getNext();
}
if (beforeL.getHead() == null)
return afterL;
mergeLinkedLists(beforeL, afterL);
return beforeL;
}
public void addToLinkedList(CustomLinkedList list, int value) {
LinkedListNode newEnd = new LinkedListNode(value);
LinkedListNode cur = list.getHead();
if (cur == null)
list.setHead(newEnd);
else {
while (cur.getNext() != null) {
cur = cur.getNext();
}
cur.setNext(newEnd);
cur = newEnd;
}
}
public void mergeLinkedLists(CustomLinkedList list1, CustomLinkedList list2) {
LinkedListNode start = list1.getHead();
LinkedListNode prev = null;
while (start != null) {
prev = start;
start = start.getNext();
}
prev.setNext(list2.getHead());
}
CustumLinkedList包含兩個屬性:-LinkedListNode其是頭和一個int它的大小。 一個LinkedListNode包含兩個屬性:一個LinkedListNode類型指向下一個節點和int類型之一:數據值
謝謝。
「有沒有辦法避免把兩個列表,然後合併嗎?」 - 你不需要合併這兩個列表。你只需要連接它們。注意:你的'mergeLinkedLists'方法的命名非常糟糕,因爲它實際上並不*合併列表,它連接它們。問題是,在'addToLinkedList'中,你總是迭代每個項目的整個列表,這使得你的算法O(n²),當它應該在O(n)中可行時。 –