链表分为三种: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)
三种情况
-
假如链表中有一堆数据,让你删除数据为9(假设数据中存在9的这个数据)那么它的时间复杂度就是
O(n)
原因就是你要能先寻找到这个9的数据在哪 并且在寻找的过程中记录好前驱节点(因为前驱节点存着后面的那个节点的指针嘛)然后删除就ok了,所以这种方式的o(n)就是为了遍历这个链表所花费的时间 -
假如直接给定一个前驱节点的指针,让我们删除后面的节点,那么我们可以直接通过这个指针找到前驱节点,然后通过它储存的后面的节点,直接ko掉后面的节点,这样它的时间复杂度就是O(1)了。
-
加入给定了一个要被删除的节点的指针,那么这个时间复杂度是多少呢?我们要做到的就是寻找它的前驱节点,ok,假如这个链表是单链表,那么寻找到前驱节点的储存后节点是指定的节点这个过程(或者简单的说要找到前驱节点)那么时间复杂度就是
o(n)
,加入给定的链表是双向链表,那么我们可以轻松的直接寻找到前驱链表,所以时间复杂度就是O(1)
。
所以综上所述,在删除链表的时候,有两个时间复杂度O(n)和O(1)
-
在某节点前插入数据,当然这根上面说的一样,单链表的话要遍历寻找到前驱链表,所以时间复杂度就是o(n),双向链表就是1
-
在某节点后插入,当然双 单 都是1