链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
Python中地址的获取(C语言中有指针,但Python中没有):
(a,b交换前)(a,b交换后,保存10的地方还存10,存20的地方还存20,改变的只是a,b自己维护的东西
先找个空间把10存起来,紧接着产生一个标号a这个新的变量,又找到一块内存把a和它绑在一起,这时候的a就代表一块空间,只不过这个空间不是存的10,而是存的10这个单元的地址
有一块空间存了f这个函数,让a=f其实就是让a 指向存储f的这块空间,同理,next=node2就是next存了node2的地址,即next指向node
class Node(object): """定义节点这个类""" def __init__(self,elem): self.elem = elem #创建这个类的对象时就可以给他传入要保存的数据 self.next = None #刚开始不知道指向谁,所以置为空 #node = Node(100) class Singlelinklist(object): """定义单链表,这个类里要实现单链表的各种操作,如链表长度,往链表添加元素等""" def __init__(self,node=None): self._head = node #保存头结点,私有属性 def is_empty(self): """链表是否为空""" return self._head #返回的是True or False? def length(self): """链表长度""" cur = self._head #游标,用来移动遍历节点,刚开始让他等于head也就是和head指向同一个地址 count = 0 #记录数量 while cur !=None: cur = cur.next count += 1 return count def travel(self): """遍历整个链表""" cur = self._head while cur != None: #print(self.elem) 错辽,这里的self指的是sll呀 print(cur.elem,end=" ") #打印在同一行end="",在Python2中逗号就行了 cur = cur.next def add(self,item): """链表头部添加元素,头插法""" node = Node(item) node.next = self._head self._head = node def append(self,item): """链表尾部添加元素""" node = Node(item) #if self.is_empty(): #相当于if self_head == None if self._head == None: self._head = node else: cur = self._head while cur.next != None: cur = cur.next cur.next = node def insert(self,pos,item): """指定位置添加元素""" node = Node(item) if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: pre = self._head count = 0 while count <(pos-1): count += 1 pre = pre.next node.next = pre.next pre.next = node def remove(self,item): """删除节点""" cur = self._head pre = None while cur != None: #找到要删的节点了就删,没找到的话游标就接着移动 if cur.elem == 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.elem == item: return True else: cur = cur.next return False #测试 if __name__ == "__main__": #只在当前文件下运行时执行 sll = Singlelinklist() print(sll.is_empty()) #None print("什么都不添加时的长度:") print(sll.length()) #0 sll.append(1) print(sll.is_empty()) #非空,打印的是self._head print("添加了1时的长度:") print(sll.length()) #1 sll.append(2) sll.append(3) sll.append(4) sll.append(5) sll.append(6) #1 2 3 4 5 6 sll.add(10) #10 1 2 3 4 5 6 sll.insert(3,100) #10 1 2 100 3 4 5 6 sll.insert(10,1000) #10 1 2 100 3 4 5 6 sll.remove(10) #删头结点 print("开始遍历所有元素:") sll.travel() print("length:",sll.length()) print(sll.search(6)) #查一下6在不在链表里
原文:https://www.cnblogs.com/fenglivoong/p/12628210.html