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

- 表元素域elem⽤来存放具体的数据。
- 链接域next⽤来存放下⼀个节点的位置(python中的标识)
- 变量p指向链表的头节点(⾸节点)的位置,从p出发能找到表中的任意节点。
节点实现
class SingleNode(object):"""单链表的结点"""def __init__(self,item):# item存放数据元素self.item = item# next是下⼀个节点的标识self.next = None
单链表的操作
- is_empty() 链表是否为空
- length() 链表⻓度
- travel() 遍历整个链表
- add(item) 链表头部添加元素
- append(item) 链表尾部添加元素
- insert(pos,item) 指定位置添加元素
- remove(item) 删除节点
- search(item) 查找节点是否存在
单链表的实现
class SingleLinkList(object):"""单链表"""def __init__(self):self.__head = Nonedef is_empty(self):"""判断链表是否为空"""return self.__head == Nonedef length(self):"""链表⻓度"""# cur初始时指向头节点cur = self.__headcount = 0# 尾节点指向None,当未到达尾部时while cur != None:count += 1# 将cur后移⼀个节点cur = cur.nextreturn countdef travel(self):"""遍历链表"""cur = self.__headwhile cur != None:print cur.item,cur = cur.nextprint ""
头部添加元素

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.__headwhile cur.next != None:cur = cur.nextcur.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.__headwhile count < (pos-1):count += 1pre = pre.next# 先将新节点node的next指向插⼊位置的节点node.next = pre.next# 将插⼊位置的前⼀个节点的next指向新节点pre.next = node
删除节点

def remove(self,item):"""删除节点"""cur = self.__headpre = Nonewhile cur != None:# 找到了指定元素if cur.item == item:# 如果第⼀个就是删除的节点if not pre:# 将头指针指向头节点的后⼀个节点self.__head = cur.nextelse:# 将删除位置前⼀个节点的next指向删除位置的后⼀个节点pre.next = cur.nextbreakelse:# 继续按链表后移节点pre = curcur = cur.next
查找节点是否存在
def search(self,item):"""链表查找节点是否存在,并返回True或者False"""cur = self.__headwhile cur != None:if cur.item == item:return Truecur = cur.nextreturn False
测试
if __name__ == "__main__":ll = SingleLinkList()ll.add(1)ll.add(2)ll.append(3)ll.insert(2, 4)print "length:",ll.length()ll.travel()print ll.search(3)print ll.search(5)ll.remove(1)print "length:",ll.length()ll.travel()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
