一、鍊錶節點
class listnode
}
二、通過節點實現鍊錶
class list else
}// 頭插法
/*頭插法就是從後往前尋找節點,當前傳入的節點在鍊錶中位於head節點之前
*/if head == nil else
}}
三、dummy節點和尾插法
dummy節點的作用是作為乙個虛擬的頭前節點。在不知道要返回的新鍊錶的頭結點是哪乙個,它可能是原鍊錶的第乙個節點,可能在原鍊錶的中間,也可能在最後,甚至不存在(nil)。引入dummy節點可以涵蓋所有情況,並且可以使用dummy.next返回最終需要的頭結點。
四、演算法例項
給出乙個鍊錶和乙個值x,要求將鍊錶中所有小於x得值放在左邊,左右大於或者等於x的值放到右邊,並且原鍊錶的節點順序不能變。例如:1 -> 5 -> 3 -> 2 -> 4 -> 2,給定x = 3,則要返回 1 -> 2 -> 2 -> 5 -> 3 -> 4。
思路:將鍊錶分為小於x節點與大於x節點進行處理,最後進行左右連線。同時採用尾插法,遍歷鍊錶。
func partiton(_ head: listnode?, _ target: int) else
node = node!.next
}predummy.next = postdummy.next
post.next = nil // 防止構成環
return predummy.next
}
測試**:
let firstnode = listnode(1)
let secondnode = listnode(5)
let thirdnode = listnode(3)
let fourthnode = listnode(2)
let fifthnode = listnode(4)
let sixthnode = listnode(2)
firstnode.next = secondnode
secondnode.next = thirdnode
thirdnode.next = fourthnode
fourthnode.next = fifthnode
fifthnode.next = sixthnode
var result = self.getleftlist(firstnode, 3)
while result != nil
注意點:post.next = nil,是為了防止鍊錶迴圈指向構成環,這是必需的但是容易忽略的一步。 演算法學習 反轉鍊錶
輸入乙個鍊錶的頭結點,將這個鍊錶反轉並輸出它的新的頭結點 public class listnode 方法一 public class solution h1.next null return head 方法二 其實我寫的這兩個差不多,為什麼要寫相似的兩個?因為我要學習區別使用p和p.next的區別...
演算法學習 2 4 鍊錶
前言 在儲存一大波數的時候我們通常用的是陣列,但有時候陣列顯得不太靈活 例如 從小到大排好的一串數字 2 3 5 8 9 10 18 26 32,我們要插入6使得其順序依然不變,如果用陣列的話就要讓8以及8往後的數都要往後挪一位,很浪費時間,但如果用鍊錶操作只需要將5的指標指向6的指標,再將6的指標...
演算法 鍊錶 鍊錶分隔(鍊錶劃分)
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 兩個臨時頭結點和尾節點,組成兩個鍊錶,分別存放較小和較大節點 完成後...