1. 程式人生 > 其它 >leetcode 707. 設計連結串列

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);
 */