package main
import (
"strings"
"strconv"
"fmt"
)
/**
雙向鏈表
*/
type DoubleLinkedList struct {
//鏈表頭節(jié)點(diǎn)
head *Node
//鏈表尾部節(jié)點(diǎn)
tail *Node
//長(zhǎng)度
size int
}
/**
遍歷器接口
*/
type Interater interface{
/**
是否還有下一個(gè)
*/
hasNext() bool
/**
下一個(gè)節(jié)點(diǎn)
*/
next() *Node
}
/**
遍歷器
*/
type ListInterater struct {
list *DoubleLinkedList
currentNode *Node
}
/**
遍歷器是否還有下一個(gè)節(jié)點(diǎn)
*/
func (inter *ListInterater) hasNext() bool{
if inter.currentNode==nil && inter.list.head!=nil {
return true
}else if inter.currentNode==nil && inter.list.head==nil {
return false
}else{
return inter.currentNode.next!=nil
}
}
/**
遍歷器獲取下一個(gè)節(jié)點(diǎn)
*/
func (inter *ListInterater) next() *Node{
if inter.currentNode==nil && inter.list.head!=nil{
inter.currentNode = inter.list.head
}else if(inter.currentNode==nil && inter.list.head==nil){
return nil
}else{
inter.currentNode = inter.currentNode.next
}
return inter.currentNode
}
/**
節(jié)點(diǎn)
*/
type Node struct {
data interface{}
prev *Node
next *Node
}
func (list *DoubleLinkedList) GetHead() *Node {
return list.head
}
func (list *DoubleLinkedList) GetTail() *Node {
return list.tail
}
func (list *DoubleLinkedList) Size() int {
return list.size
}
func (list *DoubleLinkedList) initFromNode(node *Node) {
list.head = node
list.tail = node
list.size = 1
}
func (list *DoubleLinkedList) addHead(node *Node){
oldHead :=list.head
oldHead.prev = node
node.next = oldHead
node.prev = nil
list.head = node
list.size++
}
/**
獲取鏈表的遍歷器
*/
func (list *DoubleLinkedList) Iterater() *ListInterater{
inter:=ListInterater{
list:list,
currentNode:nil,
}
return &inter
}
/**
從頭部添加節(jié)點(diǎn)
*/
func (list *DoubleLinkedList) AddFromHead(node *Node) {
if list.head==nil && list.tail==nil {
list.initFromNode(node)
}else{
list.addHead(node)
}
}
/**
從尾部添加節(jié)點(diǎn)
*/
func (list *DoubleLinkedList) addTail(node *Node){
oldTail :=list.tail
oldTail.next = node
node.prev = oldTail
node.next = nil
list.tail = node
list.size++
}
/**
刪除指定位置節(jié)點(diǎn)
*/
func (list *DoubleLinkedList) Remove(index int) {
node:=list.Get(index)
if node==nil {
return
}
prev:=node.prev
next:=node.next
if prev!=nil {
prev.next=next
}
if next!=nil {
next.prev=prev
}
list.size--
}
/**
從后面追加節(jié)點(diǎn)
*/
func (list *DoubleLinkedList) Append(node *Node) {
if list.head==nil && list.tail==nil {
list.initFromNode(node)
}else{
list.addTail(node)
}
}
/**
獲取指定位置節(jié)點(diǎn)
*/
func (list *DoubleLinkedList) Get(index int) *Node {
next:=list.head
for i:=0;i<index ;i++ {
if next.next!=nil {
next=next.next
}else{
return nil
}
}
return next
}
/**
打印鏈表
*/
func (list *DoubleLinkedList) ToString() {
str:= strings.Builder{}
str.WriteString("[")
inter:=list.Iterater()
for inter.hasNext(){
node:=inter.next()
str.WriteString(strconv.Itoa(node.data.(int)))
if inter.hasNext() {
str.WriteString(",")
}
}
str.WriteString("]")
fmt.Println(str.String())
}
func main() {
list:=DoubleLinkedList{}
for i:=1;i<=10 ;i++ {
node:=Node{
data:i,
}
list.Append(&node)
}
fmt.Println(list.Size())
fmt.Println(list.GetHead().data)
fmt.Println(list.GetTail().data)
list.Remove(5)
fmt.Println(list.Size())
fmt.Println(list.Get(5).data)
list.ToString()
}
網(wǎng)站欄目:go實(shí)現(xiàn)雙向鏈表并使用iterater遍歷
當(dāng)前地址:http://muchs.cn/article40/jchpho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站改版、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、商城網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)