- 目錄 -
雙向鏈表
尚硅谷Golang課

雙向鏈表

type HeroNode struct {
	no   int
	name string
	pre  *HeroNode //表示指向前一個節點
	next *HeroNode //表示指向下一個節點
}

//給鏈表插入節點
func Insert(head *HeroNode, newHeroNode *HeroNode) {
	//先找到最後的節點,創建一個輔助
	temp := head
	for {
		if temp.next == nil { //表示找到最後
			break
		}
		temp = temp.next //不斷往下找
	}
	//把newHeroNode加到屁股
	temp.next = newHeroNode
	newHeroNode.pre = temp
}

//根據No從小到大插入
func InsertNo(head *HeroNode, newHeroNode *HeroNode) {
	//想找到適當的節點,創建一個輔助
	temp := head
	for {
		if temp.next == nil { //表示找到最後
			break
		} else if temp.next.no > newHeroNode.no {
			//表示new要插到temp後
			break
		} else if temp.next.no == newHeroNode.no {
			//表示new這個編號已存在
			fmt.Println(newHeroNode.no, "該編號已存在")
			return
		}
		temp = temp.next //不斷往下找

	}
	//把newHeroNode加到找到的地方
	newHeroNode.next = temp.next
	newHeroNode.pre = temp
	if temp.next != nil {
		temp.next.pre = newHeroNode //temp的下一個的前一個=新
	}
	temp.next = newHeroNode
}

//根據no刪除一個節點
func DelHeroNode(head *HeroNode, id int) {
	//想找到適當的節點,創建一個輔助
	temp := head
	for {
		if temp.next == nil { //表示找到最後
			break
		} else if temp.next.no == id {
			//表示找到了
			fmt.Println(id, "該編號已刪除")
			temp.next = temp.next.next
			if temp.next != nil {
				temp.next.pre = temp
			}
			return
		}
		temp = temp.next //不斷往下找
	}

}

//顯示
func List(head *HeroNode) {
	//創建一個輔助
	temp := head
	if temp.next == nil { //空鏈表?
		fmt.Println("空")
		return
	}
	for {
		fmt.Printf("[%d,%s]==>", temp.next.no, temp.next.name)
		temp = temp.next      //不斷往下找
		if temp.next == nil { //到尾了
			fmt.Println("完畢")
			break
		}
	}
}

func main() {
	//創建一個頭節點(空的)
	head := &HeroNode{}
	hero1 := &HeroNode{
		no:   1,
		name: "宋江",
	}
	hero2 := &HeroNode{
		no:   2,
		name: "李奎",
	}
	hero3 := &HeroNode{
		no:   3,
		name: "李軌",
	}
	InsertNo(head, hero3)
	InsertNo(head, hero1)
	InsertNo(head, hero2)

	List(head)
	DelHeroNode(head, 3)
	List(head)
}

上次修改於 2021-09-01

此篇文章的評論功能已經停用。