【专题讲解】数据结构与算法——链表(附代码)

简介: 【专题讲解】数据结构与算法——链表(附代码)

1. 基本概念

链表是一种基本的数据结构,用于存储一组有序的数据元素。链表由节点组成,每个节点包含两个域:数据域和指针域。数据域用来存储数据元素,指针域用来指向链表中的下一个节点。


链表可以分为单向链表、双向链表和循环链表。单向链表只能够从头节点开始向后遍历,双向链表可以从头节点和尾节点开始向前或向后遍历,而循环链表则是在单向或双向链表的基础上将尾节点指向头节点,形成一个环。


链表的优点是可以动态地进行插入和删除操作,而且不需要像数组一样事先确定存储空间的大小。缺点是查询操作时间复杂度较高,需要从头节点开始遍历,而且需要消耗额外的空间来存储指针域。


重点归纳:

  • 顺序表与链表最坏时间复杂度对比:


在大O表示法中,时间复杂度的增长趋势通常可以分为以下几类:

  • 常数阶O(1):执行时间与问题规模无关,常量时间复杂度,如对一个元素进行常量操作。
  • 线性阶O( n n n):执行时间与问题规模成正比,如遍历一个数组。
  • 平方阶O( n 2 n^2 n2):执行时间随问题规模的增加呈平方增加,如冒泡排序。
  • 指数阶O( 2 n 2^n 2n):执行时间随问题规模的增加呈指数增加,如求解汉诺塔问题。

Python中实现a, b 值交换:a,b = b,a (Tuple 类型),Python中改变的是a,b的对象内存的地址,而不是改变对象内存内的元素

class Node:
    def __init__(self, elem):
        self.elem = elem
        self.next = None
        self.prev = None
class SingleLinkList:  #构建单向列表
    def __init__(self, node = None):
        self._head = node    #_head 是第一个节点,包含第一个元素和下一个节点的地址
    def is_empty(self):
        return self._head == None
    def append(self, item):
        node = Node(item)    #创建添加的节点
        if self._head == None:  #判断链表是否为空(用self对象(或者说实例)调用方法is_empty)
            self._head = node #如果头节点为空,把新添加的节点作为头节点
        else:
            cur = self._head  #如果头节点不为空,指定头节点为当前节点(**cur为Node类实例**), cur 与self._head 地址一样
            # print(cur)   #测试一下是否能链接
            # print(self._head)
            # print(self._head.next)
            while cur.next != None:   #在节点中的next不为空的情况下(不是最后一个节点)
                cur = cur.next    #遍历列表,把下一节点地址赋给此几点
                # print(cur)
            cur.next = node    #类的实例化,cur.next也是Node类!cur.next存入node的地址,同时self._head.next 也被赋值!!!
    def length(self):
        cur = self._head  #遍历开始
        count = 0
        while cur != None:
            count += 1
            cur = cur.next  #遍历
        return count
    def travel(self):
        cur = self._head  # 遍历开始
        while cur != None:
            print(cur.elem,end=",")
            cur = cur.next  # 遍历
    def headadd(self, item):
        node = Node(item)
        if self.is_empty():
            self._head = node
        else:
            node.next = self._head
            self._head = node
    def addatpos(self, pos, item):
        node = Node(item)
        count = 1
        cur = self._head
        while count != pos:
            count += 1
            cur = cur.next
        node.next = cur.next
        cur.next = node
    def search(self, item):
        cur = self._head
        while cur != None:
            if cur.elem == item:
                return "bingo"
                break
            cur = cur.next
            return "Nogo"
class DoubleLinkList(SingleLinkList):   #构建双向列表
    def append(self, item):
        node = Node(item)
        if self._head == None:
            self._head = node
        else:
            cur = self._head
            while cur.next != None:
                cur = cur.next   #遍历列表
            cur.next = node   #链接下一节点
            node.prev = cur
            # print(cur.prev)  #验证一下地址是不是能衔接上
            # print(cur)#验证一下地址是不是能衔接上
            # print(cur.next,end="\n\n")#验证一下地址是不是能衔接上
    def addatpos(self, pos, item):
        node = Node(item)
        count = 1
        cur = self._head
        while count != pos:
            count += 1
            cur = cur.next
        node.next = cur.next
        node.prev = cur
        cur.next = node
        cur.next.prev = node
#-------------------------以下为测试运行---------------------
# sll = SingleLinkList()
# sll.append(1)
# sll.append(2)
# sll.append(1)
# sll.append(4)
# sll.headadd(10000)
# sll.addatpos(1,999999)
# sll.travel()
# print(sll.search(2))
dll = DoubleLinkList()
dll.append(1)
dll.append(2)
dll.append(3)
dll.append(4)
dll.append(5)
dll.append(1322)
dll.addatpos(2, 88888)
print(dll.travel())


相关文章
|
1月前
|
算法
【数据结构与算法】题解 | #反转链表#
【数据结构与算法】题解 | #反转链表#
|
1月前
|
算法 索引
【数据结构与算法】5、循环链表、约瑟夫问题、静态链表
【数据结构与算法】5、循环链表、约瑟夫问题、静态链表
38 0
|
1月前
|
存储 算法
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
|
1月前
|
存储 算法 C语言
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
|
1月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
34 0
|
1月前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
23 0
|
1月前
|
存储 算法 Java
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
43 0
|
2月前
|
存储 算法 Java
【数据结构与算法】5.详解双向链表的基本操作(Java语言实现)
【数据结构与算法】5.详解双向链表的基本操作(Java语言实现)
|
2月前
|
存储 算法 Java
【数据结构与算法】4.自主实现单链表的增删查改
【数据结构与算法】4.自主实现单链表的增删查改