leetcode 707. 設計連結串列
一、題目
設計連結串列的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val和next。val是當前節點的值,next是指向下一個節點的指標/引用。如果要使用雙向連結串列,則還需要一個屬性prev以指示連結串列中的上一個節點。假設連結串列中的所有節點都是 0-index 的。
在連結串列類中實現這些功能:
get(index):獲取連結串列中第index個節點的值。如果索引無效,則返回-1。
addAtHead(val):在連結串列的第一個元素之前新增一個值為val的節點。插入後,新節點將成為連結串列的第一個節點。
addAtTail(val):將值為val 的節點追加到連結串列的最後一個元素。
addAtIndex(index,val):在連結串列中的第index個節點之前新增值為val 的節點。如果index等於連結串列的長度,則該節點將附加到連結串列的末尾。如果 index 大於連結串列長度,則不會插入節點。如果index小於0,則在頭部插入節點。
deleteAtIndex(index):如果索引index 有效,則刪除連結串列中的第index 個節點。
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //連結串列變為1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //現在連結串列是1-> 3
linkedList.get(1); //返回3
二、解法
用雙鏈表。練習go語言
type MyLinkedList struct { Head *Node Tail *Node len int } type Node struct{ Val int Next *Node Prev *Node } func Constructor() MyLinkedList { head,tail:=new(Node),new(Node) head.Next=tail tail.Prev=head list:=MyLinkedList{ Head:head, Tail:tail, } return list } func (this *MyLinkedList) GetNode(index int) *Node{ if index<0||index>=this.len{ return nil } node:=this.Head.Next for i:=0;i<index;i++{ node=node.Next } return node } func (this *MyLinkedList) Get(index int) int { node:=this.GetNode(index) if node==nil{ return -1 } return node.Val } func (this *MyLinkedList) AddAtHead(val int) { this.AddAtIndex(0,val) } func (this *MyLinkedList) AddAtTail(val int) { this.AddAtIndex(this.len,val) } func (this *MyLinkedList) AddAtIndex(index int, val int) { if index<0{ index=0 } node:=this.GetNode(index) if index==this.len{ node=this.Tail } if node==nil{ return } prev:=node.Prev newNode:=&Node{ Val:val, Next:node, Prev:prev, } prev.Next=newNode node.Prev=newNode this.len++ } func (this *MyLinkedList) DeleteAtIndex(index int) { node:=this.GetNode(index) if node!=nil{ prev,next:=node.Prev,node.Next prev.Next=next next.Prev=prev this.len-- } } /** * Your MyLinkedList object will be instantiated and called as such: * obj := Constructor(); * param_1 := obj.Get(index); * obj.AddAtHead(val); * obj.AddAtTail(val); * obj.AddAtIndex(index,val); * obj.DeleteAtIndex(index); */