3-1单向链表
Posted echo-kid-coding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-1单向链表相关的知识,希望对你有一定的参考价值。
链表
为什么需要链表
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。
链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表的定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域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 SingleNode(object): def __init__(self,item): self.item = item self.next = None class SingleLinkList(object): def __init__(self,item=None): self.__head = item def is_empty(self): return self.__head == None def length(self): cur = self.__head count = 0 while cur != None: count += 1 cur = cur.next return count def travel(self): cur = self.__head while cur != None: print(cur.item,end = ‘ ‘) cur =cur.next print("") def add(self,item): #在链表头部添加元素,头插法 node = SingleNode(item) node.next = self.__head self.__head = node def append(self,item): #在链表尾部添加元素,尾插法 node = SingleNode(item) cur = self.__head if self.is_empty(): self.__head = node else: while cur.next != None: cur = cur.next cur.next = node def insert(self,pos,item): # 在指定位置添加,pos从0开始 node = SingleNode(item) pre = self.__head count = 0 if pos <=0: self.add(item) elif pos > self.length()-1: self.append(item) else: while count < pos-1: pre = pre.next count += 1 #当循环退出后,pre指向pos-1 node.next = pre.next pre.next = node def remove(self,item): #删除节点 cur = self.__head pre = None while cur != None: if cur.item == 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.item == 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 2 3 4 5 6 ll.travel() ll.insert(3,100)#9 8 1 100 2 3 4 5 6 ll.travel() ll.insert(10,200) #9 8 1 100 2 3 4 5 6 200 ll.travel() ll.remove(8) ll.travel() ll.remove(200) ll.travel() ll.remove(9) ll.travel()
以上是关于3-1单向链表的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 7 单向链表