Python实现单项链表的最全教程

作者:Thank?CAT 时间:2021-12-21 09:45:26 

单向链表

单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

Python实现单项链表的最全教程

  • 表元素域elem用来存放具体的数据。

  • 链接域next用来存放下一个节点的位置(python中的标识)

  • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

节点实现

class Node(object):
   """节点"""
   def __init__(self, elem):
       self.elem = elem
       self.next = None

单链表的操作

  • is_empty() 链表是否为空

  • length() 链表长度

  • travel() 遍历整个链表

  • add(item) 链表头部添加元素

  • append(item) 链表尾部添加元素

  • insert(pos, item) 指定位置添加元素

  • remove(item) 删除节点

  • search(item) 查找节点是否存在

单链表的实现

class SingleLinkList(object):
   """单链表"""
   def __init__(self, node=None):
       self.__head = node

Python实现单项链表的最全教程

单链表 判断链表是否为空(is_empty)

def is_empty(self):
       """链表是否为空"""
       return self.__head == None

Python实现单项链表的最全教程

单链表 链表长度(length)

def length(self):
       """链表长度"""
       # cur游标,用来移动遍历节点
       cur = self.__head
       # count记录数量
       count = 0
       while cur != None:
           count += 1
           cur = cur.next
       return count

Python实现单项链表的最全教程

单链表 遍历整个链表(travel)

def travel(self):
       """遍历整个链表"""
       cur = self.__head
       while cur != None:
           print(cur.elem, end=" ")
           cur = cur.next
       print("")

Python实现单项链表的最全教程

单链表 链表尾部添加元素,尾插法(append)

def append(self, item):
       """链表尾部添加元素, 尾插法"""
       node = Node(item)
       if self.is_empty():
           self.__head = node
       else:
           cur = self.__head
           while cur.next != None:
               cur = cur.next
           cur.next = node

Python实现单项链表的最全教程

单链表 链表头部插入元素,头插法(add)

def add(self, item):
       """链表头部添加元素,头插法"""
       node = Node(item)
       node.next = self.__head
       self.__head = node

Python实现单项链表的最全教程

单链表 指定位置插入元素(insert)

def insert(self, pos, item):
       """指定位置添加元素
       :param  pos 从0开始
       """
       if pos <= 0:
           self.add(item)
       elif pos > (self.length()-1):
           self.append(item)
       else:
           pre = self.__head
           count = 0
           while count < (pos-1):
               count += 1
               pre = pre.next
           # 当循环退出后,pre指向pos-1位置
           node = Node(item)
           node.next = pre.next
           pre.next = node

Python实现单项链表的最全教程

单链表 删除节点(remove)

def remove(self, item):
       """删除节点"""
       cur = self.__head
       pre = None
       while cur != None:
           if cur.elem == item:
               # 先判断此结点是否是头节点
               # 头节点
               if cur == self.__head:
                   self.__head = cur.next
               else:
                   pre.next = cur.next
               break
           else:
               pre = cur
               cur = cur.next

Python实现单项链表的最全教程

单链表 查找节点是否存在(search)

def search(self, item):
       """查找节点是否存在"""
       cur = self.__head
       while cur != None:
           if cur.elem == item:
               return True
           else:
               cur = cur.next
       return False

Python实现单项链表的最全教程

单链表 完整代码及测试

# coding:utf-8

class Node(object):
   """节点"""
   def __init__(self, elem):
       self.elem = elem
       self.next = None

class SingleLinkList(object):
   """单链表"""
   def __init__(self, node=None):
       self.__head = node

def is_empty(self):
       """链表是否为空"""
       return self.__head == None

def length(self):
       """链表长度"""
       # cur游标,用来移动遍历节点
       cur = self.__head
       # count记录数量
       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
       print("")

def add(self, item):
       """链表头部添加元素,头插法"""
       node = Node(item)
       node.next = self.__head
       self.__head = node

def append(self, item):
       """链表尾部添加元素, 尾插法"""
       node = Node(item)
       if self.is_empty():
           self.__head = node
       else:
           cur = self.__head
           while cur.next != None:
               cur = cur.next
           cur.next = node

def insert(self, pos, item):
       """指定位置添加元素
       :param  pos 从0开始
       """
       if pos <= 0:
           self.add(item)
       elif pos > (self.length()-1):
           self.append(item)
       else:
           pre = self.__head
           count = 0
           while count < (pos-1):
               count += 1
               pre = pre.next
           # 当循环退出后,pre指向pos-1位置
           node = Node(item)
           node.next = pre.next
           pre.next = node

def remove(self, item):
       """删除节点"""
       cur = self.__head
       pre = None
       while cur != None:
           if cur.elem == item:
               # 先判断此结点是否是头节点
               # 头节点
               if cur == self.__head:
                   self.__head = cur.next
               else:
                   pre.next = cur.next
               break
           else:
               pre = cur
               cur = cur.next

def search(self, item):
       """查找节点是否存在"""
       cur = self.__head
       while cur != None:
           if cur.elem == item:
               return True
           else:
               cur = cur.next
       return False

if __name__ == "__main__":
   ll = SingleLinkList()
   print(ll.is_empty())
   print(ll.length())

ll.append(1)
   print(ll.is_empty())
   print(ll.length())

ll.append(2)
   ll.add(8)
   ll.append(3)
   ll.append(4)
   ll.append(5)
   ll.append(6)
   # 8 1 2 3 4 5 6
   ll.insert(-1, 9) # 9 8 1 23456
   ll.travel()
   ll.insert(3, 100) # 9 8 1 100 2 3456
   ll.travel()
   ll.insert(10, 200) # 9 8 1 100 23456 200
   ll.travel()
   ll.remove(100)
   ll.travel()
   ll.remove(9)
   ll.travel()
   ll.remove(200)
   ll.travel()
"""
result:
True
0
False
1
9 8 1 2 3 4 5 6
9 8 1 100 2 3 4 5 6
9 8 1 100 2 3 4 5 6 200
9 8 1 2 3 4 5 6 200
8 1 2 3 4 5 6 200
8 1 2 3 4 5 6
"""

链表与顺序表的对比

链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。

链表与顺序表的各种操作复杂度如下所示:

操作链表顺序表
访问元素O(n)O(1)
在头部插入/删除O(1)O(n)
在尾部插入/删除O(n)O(1)
在中间插入/删除O(n)O(n)

注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。

来源:https://www.cnblogs.com/thankcat/p/17032027.html

标签:Python,单项链表
0
投稿

猜你喜欢

  • 关于ASP代码的加密

    2007-10-15 12:30:00
  • python 字段拆分详解

    2021-03-16 22:59:58
  • selenium+python实现自动登录脚本

    2021-09-30 01:36:19
  • mssqlserver恢复ldf文件数据的方法

    2024-01-22 11:06:54
  • 全面解析Bootstrap表单使用方法(表单样式)

    2024-05-10 14:08:28
  • Python 爬虫之超链接 url中含有中文出错及解决办法

    2023-07-27 00:25:06
  • Python 调用API发送邮件

    2021-08-26 04:20:22
  • Python对象的生命周期源码学习

    2022-04-04 23:21:24
  • 如何判断电子邮件的地址格式是否正确?

    2010-01-12 20:12:00
  • Python Pandas 修改表格数据类型 DataFrame 列的顺序案例

    2023-02-27 17:47:37
  • vscode调试container中的程序的方法步骤

    2022-03-06 14:20:25
  • 十条建议帮你提高Python编程效率

    2021-07-18 02:55:54
  • Python入门教程4. 元组基本操作 <font color=red>原创</font>

    2021-01-12 09:53:21
  • Python实现小数转化为百分数的格式化输出方法示例

    2023-07-15 05:58:15
  • python用10行代码实现对黄 色图片的检测功能

    2023-11-16 23:48:33
  • Centos7 下安装最新的python3.8

    2023-04-29 14:44:13
  • flask route对协议作用及设计思路

    2023-01-19 13:21:34
  • Python使用import导入本地脚本及导入模块的技巧总结

    2022-09-07 15:09:29
  • Python实现列表删除重复元素的三种常用方法分析

    2022-02-17 20:21:36
  • mysql服务启动却连接不上的解决方法

    2024-01-24 23:45:13
  • asp之家 网络编程 m.aspxhome.com