演算法 鍊錶學習

2021-10-05 02:34:11 字數 1387 閱讀 1006

一、鍊錶節點

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 兩個臨時頭結點和尾節點,組成兩個鍊錶,分別存放較小和較大節點 完成後...