首页 > 其他分享 >golang 的双向循环链表

golang 的双向循环链表

时间:2022-09-28 18:24:10浏览次数:48  
标签:node golang cur fmt next 链表 双向 Ring prev

             

         如下为go 实现的双向循环列表。

package main

import (
           "fmt"
       ) 
       
       
type Ring struct{
    prev, next *Ring
    val interface{}
}       


func (r *Ring)init() *Ring {
   r.prev = r
   r.next = r   
   return r
}


func (r *Ring)iterate_clockward(){
    cur := r.next
   
    if cur == r {
       fmt.Println("clockward sigle node ")
       return
    }
   
    for cur != r {
       
       fmt.Println("cur ", cur.val)
       cur = cur.next
    }
}


func (r *Ring)iterate_counterclock(){

    cur := r.prev
    if cur == r {
       fmt.Println("counterclock sigle node")
       return
    }
   
    for cur != r {
       fmt.Println("cur ", cur.val)
       cur = cur.prev
    }
}


//insert in the first place, r as the head
func (r *Ring)insert(a interface{}){
    
    node := new(Ring)     
    node.val = a
    
    next := r.next
    
    node.next = next
    node.prev = r
    
    r.next = node
    next.prev = node    
}


func (r *Ring)unlink(a interface{}){
   
   cur := r.next
   
   if cur == r {
      fmt.Println("single node")
      return
   }
   
   for cur != r {
       if cur.val == a {
          prev := cur.prev
          next := cur.next
          prev.next = next
          next.prev = prev
          return
       }
       
       cur = cur.next
   }
}


func (r *Ring)len() int {
   
   cur := r.next
   
   if cur == r {
      fmt.Println("single node")
      return 0
   }
   
   i := 0
   for cur != r {
       i++       
       cur = cur.next
   }
   
   return i
}


func main(){

   r := new(Ring)
   r.init()
   
   for i := 0; i < 5; i++ {
       r.insert(i)
   }
   
   r.iterate_clockward()
   
   fmt.Println("before unlink len", r.len())
   
   r.unlink(2)
   
   fmt.Println("after unlink len", r.len())     
   
   fmt.Println("counter clock")
   
   r.iterate_counterclock()

}

 

打印结果如下:

cur 4
cur 3
cur 2
cur 1
cur 0
before unlink len 5
after unlink len 4
counter clock
cur 0
cur 1
cur 3
cur 4

 

标签:node,golang,cur,fmt,next,链表,双向,Ring,prev
From: https://www.cnblogs.com/wallywl/p/16739125.html

相关文章

  • [数组和链表的区别]
    [数组和链表的区别]数组'''数组插入数据因为需要连在一起,如果内存空间不连续就得全体迁移,甚至出现内存空间足够但是由于不在一起而导致无法为数组分配内存。'''链......
  • vue双向绑定原理
    Vue双向绑定的原理一、在讲vue双向绑定之前我们需要来了解下MVVM模式MVVM(Model-View-ViewModel)是对MVC(Model-View-Control)和MVP(Model-View-Presenter)的进一步改进。View......
  • 原生Redis跨数据中心双向同步优化实践
    一、背景公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度。需要保证多数据中心容灾或者实现用户......
  • 原生Redis跨数据中心双向同步优化实践
    一、背景公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度。需要保证多数据中心容灾或者实现用......
  • lc234判断回文链表 isPalindrome python3
    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。classSolution:defisPalindrome(self,head:ListNode)->bool:v......
  • golang map 和 interface 的一些记录
    golang的map读取是不需要判断key是否存在的,不存在的key会返回默认值。如果map的value是interface,那么interface是需要先进行类型转换的,非要求类型的转换,得到结果是nil。......
  • 单链表的递增排序
    voiesort(LinkList&L){LNode*p=L->next;LNode*pre;LNode*r=p->next;p->next=NULL;p=r;while(p!=NULL){r=p......
  • Golang-常用算法
    快速排序funcQuickSort(sort[]int)[]int{ iflen(sort)<=1{ returnsort } low:=make([]int,0,0) mid:=make([]int,0,0) high:=make([]int,0,0......
  • 【Golang】PHP转Go强大的工具库
    PHP的朋友应该会被PHP中两大特性折服:1、强大的array,一切皆Array;2、强大的函数库,函数类型非常丰富。一、简单示例1、例如:md5函数Go版本写法:packagemainimport......
  • 【Golang】关于Golang中一些优秀的类库
    一、CLI命令(spf13/cobra)GitHub地址:https://github.com/spf13/cobra Cobra既是一个创建强大的现代CLI应用程序的库,也是一个生成应用程序和命令的程序。可以使用这个......