PYTHON中的链表

链表的定义

链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。

python代码:

  1. class Node():
  2. '创建节点'
  3. def __init__(self,data):
  4. self.data = data
  5. self.next = None
  6. class LinkList():
  7. '创建列表'
  8. def __init__(self, node):
  9. '初始化列表'
  10. self.head = node
  11. self.head.next = None
  12. self.tail = self.head
  13. def add_node(self, node):
  14. '添加节点'
  15. self.tail.next = node
  16. self.tail = self.tail.next
  17. def view(self):
  18. '查看列表'
  19. node = self.head
  20. link_str = ''
  21. while node is not None:
  22. if node.next is not None:
  23. link_str += str(node.data) + '-->'
  24. else:
  25. link_str += str(node.data)
  26. node = node.next
  27. print ('The Linklist is:' + link_str)
  28. def length(self):
  29. '列表长度'
  30. node = self.head
  31. count = 1
  32. while node.next is not None:
  33. count += 1
  34. node = node.next
  35. print ('The length of linklist are %d' % count)
  36. return count
  37. def delete_node(self, index):
  38. '删除节点'
  39. if index+1 > self.length():
  40. raise IndexError('index out of bounds')
  41. num = 0
  42. node = self.head
  43. while True:
  44. if num == index-1:
  45. break
  46. node = node.next
  47. num += 1
  48. tmp_node = node.next
  49. node.next = node.next.next
  50. return tmp_node.data
  51. def find_node(self, index):
  52. '查看具体节点'
  53. if index+1 > self.length():
  54. raise IndexError('index out of bounds')
  55. num = 0
  56. node = self.head
  57. while True:
  58. if num == index:
  59. break
  60. node = node.next
  61. num += 1
  62. return node.data

测试代码:

  1. node1 = Node(10)
  2. node2 = Node('dec')
  3. node3 = Node(1010)
  4. node4 = Node('bin')
  5. node5 = Node(12)
  6. node6 = Node('oct')
  7. node7 = Node('A')
  8. node8 = Node('hex')
  9. linklist = LinkList(node1)
  10. linklist.add_node(node2)
  11. linklist.add_node(node3)
  12. linklist.add_node(node4)
  13. linklist.add_node(node5)
  14. linklist.add_node(node6)
  15. linklist.add_node(node7)
  16. linklist.add_node(node8)
  17. linklist.view()
  18. linklist.length()
  19. linklist.delete_node(1)
  20. linklist.view()
  21. find_node = linklist.find_node(6)
  22. print (find_node)

测试结果:

  1. The Linklist is:10-->dec-->1010-->bin-->12-->oct-->A-->hex
  2. The length of linklist are 8
  3. The length of linklist are 8
  4. The Linklist is:10-->1010-->bin-->12-->oct-->A-->hex
  5. The length of linklist are 7
  6. hex

 

    ### Python链表的实现与使用 #### 链表的基本概念 链表是一种常见的线性数据结构,由一系列节点组成。每个节点包含两部分:存储的数据和指向下一个节点的指针。在Python中可以通过定义`Node`类来表示节点,并通过操作这些节点构建链表。 --- #### 节点类的定义 为了实现链表,首先需要定义一个`Node`类,用于保存数据以及指向下一个节点的引用: ```python class Node: def __init__(self, data=None): self.data = data # 存储的数据 self.next = None # 指向下一个节点的指针 ``` 上述代码定义了一个简单的节点类[^1],其中`data`字段用来存储实际数据,而`next`字段则是一个指向下一节点的对象引用。 --- #### 单链表的实现 接下来可以定义一个单链表类`LinkedList`,它包含了对链表的各种基本操作方法,例如插入、删除、查找等。 以下是单链表的一个完整实现示例: ```python class LinkedList: def __init__(self): self.head = None # 初始化头节点为空 def is_empty(self): """ 判断链表是否为空 """ return self.head is None def append(self, data): """ 尾部追加新节点 """ new_node = Node(data) if self.is_empty(): self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node def prepend(self, data): """ 头部插入新节点 """ new_node = Node(data) new_node.next = self.head self.head = new_node def delete_by_value(self, value): """ 删除指定值的第一个匹配项 """ if not self.head: return if self.head.data == value: # 如果要删除的是头节点 self.head = self.head.next return current = self.head while current.next and current.next.data != value: current = current.next if current.next: # 找到目标节点并删除 current.next = current.next.next def find(self, key): """ 查找是否存在某值 """ current = self.head while current: if current.data == key: return True current = current.next return False def display(self): """ 输出整个链表的内容 """ elements = [] current = self.head while current: elements.append(current.data) current = current.next print(elements) ``` 以上代码实现了单链表的核心功能,包括初始化、头部插入、尾部插入、按值删除、查找以及显示链表内容等功能[^2]。 --- #### 循环链表的实现 循环链表是一种特殊的链表形式,在这种链表中最后一个节点会连接回第一个节点形成闭环。其实现方式如下所示: ```python class CircularLinkedList(LinkedList): def append(self, data): """ 修改append函数使其支持循环特性 """ new_node = Node(data) if self.is_empty(): self.head = new_node self.head.next = self.head # 自己指向自己构成循环 else: current = self.head while current.next != self.head: # 寻找最后一位节点 current = current.next current.next = new_node new_node.next = self.head # 新增节点指向头结点完成闭合 ``` 此版本继承自普通的单链表类,并重写了`append()`方法以适应循环需求[^3]。 --- #### 如何找到链表中的中间节点? 对于这个问题,通常采用双指针法解决。具体思路是设置两个指针——慢指针每次移动一步;快指针每次移动两步。当快指针到达终点时,慢指针正好位于中间位置。 伪代码逻辑如下: - 定义两个变量 `slow`, `fast` 均初始指向头节点; - 当 `fast` 和其后续均不为 null,则让 `slow` 移动一次,`fast` 移动两次; - 返回最终停留处即为目标结果。 这种方法的时间复杂度仅为O(n),空间复杂度为O(1)[^1]。 --- 问题
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值