zoukankan      html  css  js  c++  java
  • 单向链表实现原理

    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    //通过结构体嵌套本结构体指针来实现链表
    //结构体可以嵌套本结构体指针, 但不能嵌套本结构体本身, 长度不能超过 1024
    type LinkNode struct {
    	Data interface{}
    	Next *LinkNode // right , 可以嵌套本结构体指针
    	//Next LinkNode // error, 不能嵌套本结构体本身
    }
    
    //创建链表 Create(数据)
    func (node *LinkNode) Create(Data ...interface{}) { //1,2
    	if node == nil {
    		return
    	}
    	//头节点
    	head := node
    
    	for i := 0; i < len(Data); i++ {
    		//创建一个新的节点
    		newNode := new(LinkNode)
    		newNode.Data = Data[i]
    		newNode.Next = nil
    		//将新节点作为当前节点的下一个节点
    		node.Next = newNode
    		node = node.Next
    	}
    	node = head
    
    }
    
    //打印链表
    func (node *LinkNode) Print() {
    	if node == nil {
    		return
    	}
    
    	//打印数据
    	if node.Data != nil {
    		fmt.Println(node.Data, " ")
    	}
    	//使用递归遍历下一个数据
    	node.Next.Print()
    }
    
    //链表长度
    func (node *LinkNode) Length() int {
    	if node == nil {
    		return -1
    	}
    
    	i := 0
    	//一次查找下一个节点是否为nil
    	for node.Next != nil {
    		i++
    		node = node.Next
    	}
    	return i
    }
    
    //插入数据(头插)
    func (node *LinkNode) InsertByHead(Data interface{}) {
    	if node == nil {
    		return
    	}
    	if Data == nil {
    		return
    	}
    
    	//head:=node
    
    	//创建新节点
    	newNode := new(LinkNode)
    	//新节点赋值
    	newNode.Data = Data
    	newNode.Next = node.Next
    	//将新节点放在当前节点后面
    	node.Next = newNode
    }
    
    //插入数据(尾插)
    func (node *LinkNode) InsertByTail(Data interface{}) {
    	if node == nil {
    		return
    	}
    
    	//查找链表的末尾位置
    	for node.Next != nil {
    		node = node.Next
    	}
    	//创建新节点  赋值
    	newNode := new(LinkNode)
    	newNode.Data = Data
    	newNode.Next = nil
    	//将新节点放在链表末尾
    	node.Next = newNode
    }
    
    //插入数据(下标)位置
    func (node *LinkNode) InserrByIndex(index int, Data interface{}) {
    	if node == nil {
    		return
    	}
    	if index < 0 {
    		return
    	}
    	/*
    	if node.Length() < index{
    		return
    	}
    	*/
    
    	//记录上一个节点
    	preNode := node
    	for i := 0; i < index; i++ {
    		preNode = node
    		//如果超出链表个数 直接返回
    		if node == nil {
    			return
    		}
    		node = node.Next
    	}
    
    	//创建一个新节点
    	newNode := new(LinkNode)
    	newNode.Data = Data
    	newNode.Next = node
    
    	//上一个节点链接当前节点
    	preNode.Next = newNode
    
    }
    
    //删除数据(下标)位置
    func (node *LinkNode) DeleteByIndex(index int) {
    	if node == nil {
    		return
    	}
    
    	if index < 0 {
    		return
    	}
    	//记录上一个链表节点
    	preNode := node
    	for i := 0; i < index; i++ {
    		preNode = node
    		if node == nil {
    			return
    		}
    		node = node.Next
    	}
    
    	//将上一个指针域结点指向node的下一个节点
    	preNode.Next = node.Next
    
    	//销毁当前节点
    	node.Data = nil
    	node.Next = nil
    	node = nil
    }
    
    //删除数据(数据)
    func (node *LinkNode) DeleteByData(Data interface{}) {
    	if node == nil {
    		return
    	}
    	if Data == nil {
    		return
    	}
    
    	preNode := node
    	for node.Next != nil {
    		preNode = node
    		node = node.Next
    
    		//判断interface存储的数据类型是否相同
    		//reflect.DeepEqual()
    		if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data {
    			preNode.Next = node.Next
    
    			//销毁数据
    			node.Data = nil
    			node.Next = nil
    			node = nil
    
    			//如果添加return 表示删除第一个相同的数据
    			//如果不添加return 表示删除所有相同的数据
    			return
    		}
    
    	}
    }
    
    //查找数据 (数据)
    func (node *LinkNode) Search(Data interface{}) int {
    	if node == nil {
    		return -1
    	}
    	if Data == nil {
    		return -1
    	}
    
    	i := 0
    	for node.Next != nil {
    		i++
    		//比较两个接口中的内容是否相同
    		//reflect.DeepEqual()
    		if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data {
    			return i - 1
    		}
    		node = node.Next
    	}
    	return -1
    }
    
    //销毁链表
    func (node *LinkNode) Destroy() {
    	if node == nil {
    		return
    	}
    	//通过递归毁销毁链表
    	node.Next.Destroy()
    
    	node.Data = nil
    	node.Next = nil
    	node = nil
    }
    
  • 相关阅读:
    MindMup 是一个开源的、在线的、简单的思维导图工具
    那些年我们用过的Python代码
    我心目中要求不高的理想团队
    与雨林再辩科学、宗教和道
    MySQL(一) 数据表数据库的基本操作
    hibernate(六) cascade(级联)和inverse关系详解
    java虚拟机内存区域的划分以及作用详解
    MySQL(二) 数据库数据类型详解
    MySQL(三) 数据库表的查询操作【重要】
    MySQL(四) 数据表的插入、更新、删除数据
  • 原文地址:https://www.cnblogs.com/lurenq/p/12081780.html
Copyright © 2011-2022 走看看