当前位置:   article > 正文

Python数据结构之链表(linked list)

python中linked list怎么导入多个节点

Python数据结构之链表

一、链表的基本知识

最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识。什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是真正意义上的链表(linked list)。链表是由一系列的节点(node)来实现的,通过每一个node存储下一个节点的指针来实现一种快速的插入。此外每个节点都有一个cargo包含一定的数据。根据链表结构的不同,其种类可以分为单向链表、单项循环链表、双向链表、双向循环链表等。

二、创建一个新链表

由于链表的功能是依靠节点来完成的,所以链表的建立必然要先建立节点类。我们通过节点间传递值的方式将指针指向下一个节点。如下代码是一个链表的创建,下一节将介绍如何遍历(traverse)链表。

  1. class Node:
  2. def __init__(self, dataval=None):
  3. self.dataval = dataval
  4. self.nextval = None
  5. class SLinkedList:
  6. def __init__(self):
  7. self.headval = None
  8. li = SLinkedList()
  9. li.headval = Node("Mon")
  10. e2 = Node("Tue")
  11. e3 = Node("Wed")
  12. # 连接第一第二个节点
  13. li.headval.nextval = e2
  14. # 连接第二第三个节点
  15. e2.nextval = e3
  16. print(e2.nextval)
  17. #结果为e3内存地址<__main__.Node object at 0x0000001A0F9644BE0>
  18. print(e2.nextval.dataval)
  19. #结果为e3所代表的值Wed
  20. 复制代码

三、链表遍历

在创建完链表之后,可以通过输入第一个节点的方式遍历整个链表

  1. #在链表末尾添加一个新的node
  2. def append(self, newdata):
  3. NewNode = Node(newdata)
  4. if self.headval is None:
  5. self.headval = NewNode
  6. return
  7. laste = self.headval
  8. while(laste.nextval):
  9. laste = laste.nextval
  10. laste.nextval=NewNode
  11. # 打印链表
  12. def show(self):
  13. printval = self.headval
  14. while printval:
  15. print (printval.dataval)
  16. printval = printval.nextval
  17. 复制代码

结果是:

  1. Mon
  2. Tue
  3. Wed
  4. Thu
  5. 复制代码

四、插入

在链表中插入一个元素指的是将指针从一个已经存在的节点指向一个新插入的节点。取决于不同的插入位置,主要有以下几种情形。

1、插入在链表开头

在开头插入一个节点顾名思义是将原来的节点变为第二个节点即可,后续排列顺序不变。

  1. #插入在开头位置,链表左侧
  2. def add_left(self,newdata):
  3. NewNode = Node(newdata)
  4. 复制代码

结果:

  1. Sun
  2. Mon
  3. Tue
  4. Wed
  5. 复制代码
2、插入在链表末尾

和插入在开头类似,需要做的是将原本链表末尾的指针指向新的节点,即原本最后一个指针变为倒数第二个,新节点变成最后一个节点。

  1. #添加道末尾
  2. def append(self, newdata):
  3. NewNode = Node(newdata)
  4. #判断是否原链表没有节点,如果没有,该节点就是第一个节点
  5. if not self.headval:
  6. self.headval = NewNode
  7. return
  8. laste = self.headval
  9. #while执行后,laste.nextval如果一直存在,遍历直至原链表最后一个
  10. while(laste.nextval):
  11. laste = laste.nextval
  12. #在原最后一个节点之后再续一个节点
  13. laste.nextval=NewNode
  14. li.append("Thu")
  15. li.show()
  16. 复制代码

结果:

  1. Mon
  2. Tue
  3. Wed
  4. Thu
  5. 复制代码

3、在两个元素中间插入

如果大家向在链表中间插入一个节点,又该怎么办呢?相信大家在熟悉了前两种插入模式后,对在链表中间插入应该也能掌握吧。没错,他们都是异曲同工的。同样是在指针上做文章。把需要插入位置的前一个指针指向新节点,将新节点的指针指向插入位置的下一个节点即可。

  1. class Node:
  2. def __init__(self, dataval=None):
  3. self.dataval = dataval
  4. self.nextval = None
  5. class SLinkedList:
  6. def __init__(self):
  7. self.headval = None
  8. # 添加节点
  9. def insert(self,middle_node,newdata):
  10. if not middle_node:
  11. print("The mentioned node is absent")
  12. return
  13. NewNode = Node(newdata)
  14. NewNode.nextval = middle_node.nextval
  15. middle_node.nextval = NewNode
  16. # 打印列表
  17. def listprint(self):
  18. printval = self.headval
  19. while printval is not None:
  20. print (printval.dataval)
  21. printval = printval.nextval
  22. li = SLinkedList()
  23. li.headval = Node("Mon")
  24. e2 = Node("Tue")
  25. e3 = Node("Thu")
  26. li.headval.nextval = e2
  27. e2.nextval = e3
  28. li.insert(list.headval.nextval,"Fri")
  29. li.show()
  30. 复制代码

结果:

  1. Mon
  2. Tue
  3. Fri
  4. Thu
  5. 复制代码

五、删除链表元素

讲完了增加,那么紧接着的便是删除啦。

  1. class Node:
  2. def __init__(self, data=None):
  3. self.data = data
  4. self.next = None
  5. class SLinkedList:
  6. def __init__(self):
  7. self.head = None
  8. def add_left(self, data_in):
  9. NewNode = Node(data_in)
  10. NewNode.next = self.head
  11. self.head = NewNode
  12. # 删除节点
  13. def remove(self, Removekey):
  14. HeadVal = self.head
  15. if not HeadVal:
  16. if (HeadVal.data == Removekey):
  17. self.head = HeadVal.next
  18. HeadVal = None
  19. return
  20. while not HeadVal:
  21. if HeadVal.data == Removekey:
  22. break
  23. prev = HeadVal
  24. HeadVal = HeadVal.next
  25. if (HeadVal == None):
  26. return
  27. prev.next = HeadVal.next
  28. HeadVal = None
  29. def show(self):
  30. printval = self.head
  31. while (printval):
  32. print(printval.data),
  33. printval = printval.next
  34. li = SLinkedList()
  35. li.add_left("Mon")
  36. li.add_left("Tue")
  37. li.add_left("Wed")
  38. li.add_left("Thu")
  39. li.add_left("Tue")
  40. li.show()
  41. 复制代码

结果:

  1. Thu
  2. Wed
  3. Mon
  4. 复制代码

参考:tutorialspoint

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1005112
推荐阅读
相关标签
  

闽ICP备14008679号