Skip to content

Latest commit

 

History

History
 
 

1

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

关于链表相关的算法。

链表的分类

链表分为三种:1 单向链表 2 双向链表 3 循环链表

实现单向,双向,循环链表以及增删操作

实现代码,以及具体的代码分析

实现单向链表的反转

func (l *LinkedList) Reverse() {
	now := l.head.next
	var pre *sNode = nil
	for now != nil {
		tem := now.next // 已经记录好了下一位
		now.next = pre // 将 now.next 改写成 前一个now
		pre = now  // pre 就是前一个now
		now = tem // now 等于下一位
	}
	l.head.next = pre
}

//举个例子:

0 - 1-2-3-4-5-6
//第一次 now等于1 pre等于nil tem等于2 now.next=nil pre= 1 now = 2 这个时候的链表是 0-1-nil
//第二次 now等于2 tem等于3 now.next 等于1 pre等于2 now 等于3 链表是 0-2-1 剩余 3456 
//第三次 now等于3 tem等于4 now.next 等于2 now等于4 pre 等于 3链表是 0-4-2-1 剩余 456 
//第四次 now等于4 tem等于5 now.next 等于3 now等于5 pre等于4 链表是 0-5--4-3-2-1 剩余 56
//第五次 now等于5 tem等于6 ...  剩余 6
//now等于6 tem等于nil now.next = 5 now = nil 
//然后 将这个链表的 跟liknklist挂钩也牛市 l.head.next = pre 即可

实现代码,以及具体的代码分析

实现两个有序链表合并为一个有序链表

实现代码,以及具体的代码分析

实现求链表的中间结点

实现代码,以及具体的代码分析

分析链表的增删查的时间复杂度

链表删除数据的时间复杂度

有两个答案O(1) O(n)三种情况

  1. 假如链表中有一堆数据,让你删除数据为9(假设数据中存在9的这个数据)那么它的时间复杂度就是O(n)原因就是你要能先寻找到这个9的数据在哪 并且在寻找的过程中记录好前驱节点(因为前驱节点存着后面的那个节点的指针嘛)然后删除就ok了,所以这种方式的o(n)就是为了遍历这个链表所花费的时间

  2. 假如直接给定一个前驱节点的指针,让我们删除后面的节点,那么我们可以直接通过这个指针找到前驱节点,然后通过它储存的后面的节点,直接ko掉后面的节点,这样它的时间复杂度就是O(1)了。

  3. 加入给定了一个要被删除的节点的指针,那么这个时间复杂度是多少呢?我们要做到的就是寻找它的前驱节点,ok,假如这个链表是单链表,那么寻找到前驱节点的储存后节点是指定的节点这个过程(或者简单的说要找到前驱节点)那么时间复杂度就是o(n) ,加入给定的链表是双向链表,那么我们可以轻松的直接寻找到前驱链表,所以时间复杂度就是O(1)

所以综上所述,在删除链表的时候,有两个时间复杂度O(n)和O(1)

链表插入数据的时间复杂度

  1. 在某节点前插入数据,当然这根上面说的一样,单链表的话要遍历寻找到前驱链表,所以时间复杂度就是o(n),双向链表就是1

  2. 在某节点后插入,当然双 单 都是1