1 问题1 w' C8 f/ y3 ^- `6 H( Z
链表在python中使用类(相当于C中的结构)实现链表,实现方法也同C语言一样,但是python中没有指针的概念,于是就采用嵌套的方式,将一个实例赋给指针域,效果就同指针一样。但是同C一样,这样的做法,需要实例化对象起指针的作用,这样会降低数据的存储密度。而有关单向链表的实现还存在些许疑点,本次周博客将针对于此问题展开讨论。! A$ V3 r0 }# l# Z/ }6 M1 j" j
2 方法
1 s5 Y1 x4 c6 Q$ d$ i- ?; c& s- 定义一个创建节点的类;
- 定义一个单向链表类;
- 实现单向链表的展示功能.! n0 h! x* V! ^' q
通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。
# i; \. M& j; _ y' n( C5 M% I
- class SingleLinkList(object):
- """单链表"""
- def __init__(self):
- self._head = None
- def is_empty(self):
- """判断链表是否为空"""
- return self._head == None
- def length(self):
- """链表长度"""
- # cur初始时指向头节点
- cur = self._head
- count = 0
- # 尾节点指向None,当未到达尾部时
- while cur != None:
- count += 1
- # 将cur后移一个节点
- cur = cur.next
- return count
- def travel(self):
- """遍历链表"""
- cur = self._head
- while cur != None:
- print(cur.item)
- cur = cur.next
- def add(self, item):
- """头部添加元素"""
- # 先创建一个保存item值的节点
- node = SingleNode(item)
- # 将新节点的链接域next指向头节点,即_head指向的位置
- node.next = self._head
- # 将链表的头_head指向新节点
- self._head = node
- def append(self, item):
- """尾部添加元素"""
- node = SingleNode(item)
- # 先判断链表是否为空,若是空链表,则将_head指向新节点
- if self.is_empty():
- self._head = node
- # 若不为空,则找到尾部,将尾节点的next指向新节点
- else:
- cur = self._head
- while cur.next != None:
- cur = cur.next
- cur.next = node
- def insert(self, pos, item):
- """指定位置添加元素"""
- # 若指定位置pos为第一个元素之前,则执行头部插入
- if pos <= 0:
- self.add(item)
- # 若指定位置超过链表尾部,则执行尾部插入
- elif pos > (self.length() - 1):
- self.append(item)
- # 找到指定位置
- else:
- node = SingleNode(item)
- count = 0
- # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
- pre = self._head
- while count < (pos - 1):
- count += 1
- pre = pre.next
- # 先将新节点node的next指向插入位置的节点
- node.next = pre.next
- # 将插入位置的前一个节点的next指向新节点
- pre.next = node
- def remove(self, item):
- """删除节点"""
- cur = self._head
- pre = None
- while cur != None:
- # 找到了指定元素
- if cur.item == item:
- # 如果第一个就是删除的节点
- if not pre:
- # 将头指针指向头节点的后一个节点
- self._head = cur.next
- else:
- # 将删除位置前一个节点的next指向删除位置的后一个节点
- pre.next = cur.next
- break
- else:
- # 继续按链表后移节点
- pre = cur
- cur = cur.next
- def search(self, item):
- """链表查找节点是否存在,并返回True或者False"""
- cur = self._head
- while cur != None:
- if cur.item == item:
- return True
- cur = cur.next
- return False
3 结语3 K3 l" {) X" o" r1 u: j& T
针对有关单向链表的实现的问题,提出本次博客所涉及的方法,通过本次Python实验,证明该方法是有效的,本此的方法还存在许多不足或考虑不周的地方,希望可以在未来的学习过程中找到更有效的方法解决此类问题。 |