数据结构 单向链表 双向链表 环形链表 约瑟夫问题

链表

线性表,但是并不会按现行的顺序储存数据,而是在每一个节点里存到下一个节点的地址。

单向链表

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。

数据结构 单向链表 双向链表 环形链表 约瑟夫问题

插入(2种)

// 给链表插入一个结点
// 编写1种插入方法,在单链表的最后加入【简单】
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
	// 1.先找到该链表的最后这个结点
	// 2.建一个辅助结点【跑龙套,帮忙】
	temp := head
	for {
		if temp.next == nil { //表示找到最后
			break
		}
		temp = temp.next //让temp不断的指向下一个结点
	}

	// 3.将newHeroNode加入到链表的最后
	temp.next = newHeroNode
}
  1. 参数:传入头结点和新节点指针地址
  2. 辅助变量为头结点
  3. 循环找到链表的最后,找到break循环,未找到让temp不断的指向下一个节点
  4. 将新节点加入到链表的最后
// 编写2种插入方法,根据no的编号从小到大插入【实用】
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
	// 1.找到适当的结点
	// 2.创建一个辅助结点【跑龙套,帮忙】
	temp := head
	flag := true
	// 让插入的结点的no和temp的下一个结点的no比较
	for {
		if temp.next == nil { //说明到链表的最后
			break
		} else if temp.next.no >= newHeroNode.no {
			// 说明newHeroNode就应该插入到temp后面
			break
		} else if temp.next.no == newHeroNode.no {
			// 说明我们链表中已经有这个no,就不插入
			flag = false
			break
		}
		temp = temp.next
	}

	if !flag {
		fmt.Println("抱歉,已经存在no=", newHeroNode.no)
		return
	} else {
		newHeroNode.next = temp.next
		temp.next = newHeroNode
	}
}
  1. 参数:传入头结点和新节点指针地址
  2. 辅助变量为头结点,标志位flag为true
  3. 循环找到链表的最后,到链表的最后跳出,继续循环执行下一个节点
  4. 让插入节点的no和temp比较大小,说明newHeroNode就应该插入到temp后面
  5. 让插入节点的no和temp比较相等,相等就说明已经有相同的no,不插入,flag为false,跳出
  6. 判断标志位给出no重复提示,否则,插入新节点

删除

  1. 循环找到要删除节点的no,和temp的下一个节点的no比较
  2. 找到后改标志位跳出,判断标志位删除 temp.next = temp.next.next

双向链表

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

数据结构 单向链表 双向链表 环形链表 约瑟夫问题

环形链表

约瑟夫问题

上一篇:使用koa2-generator快速构建koa项目


下一篇:Koa2中使用art-template模板和静态资源托管