单向链表

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

  • 表元素域elem用来存放具体的数据。
  • 链接域next用来存放下一个节点的位置(python中的标识)
  • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

节点的实现

class SingleNode(object):
"""单链表的节点"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None

测试

# 创建两个节点
s1 = SingleNode(10)
s2 = SingleNode(12)
# 将节点2绑定到节点1的next属性上
s1.next = s2
print('s1:', s1.item) # s1: 10
print('s2:', s1.next.item) # s2: 12

单链表的操作

  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

单链表的实现

class SingleLinkList(object):
"""单链表"""
def __init__(self):
self.head = None def is_empty(self):
"""判断链表是否为空"""
return self.head is None def length(self):
"""计算链表长度"""
# cur初始时指向头节点
cur = self.head
count = 0
# cur指向None,说明到达了尾节点
while cur is not None:
count += 1
cur = cur.next
return count

遍历链表

def travel(self):
"""遍历链表"""
cur = self.head
while cur is not None:
print(cur.item)
cur = cur.next

头部添加元素

 def add(self, item):
"""头部添加元素"""
# 创建一个保存item值的节点
node = SingleNode(item)
# 将新节点的链接域指向头节点
node.next = self.head
# 将链表的头head指向新节点
self.head = node

尾部追加元素

def append(self, item):
"""尾部追加元素"""
# 创建一个保存item值的节点
node = SingleNode(item)
# 先判断链表是否为空,若是空链表,则将head指向新节点
if self.is_empty():
self.head = node
# 若不为空,则找到尾部,将尾节点的next指向新节点
else:
cur = self.head
# 遍历链表,找到最后一个节点
while cur.next is not 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)
# pre_node用来指向指定位置pos的前一个节点pos-1,从头节点开始移动到指定位置
pre_node = self.head
num = 0
while num < pos - 1:
num += 1
pre_node = pre_node.next
# 把新节点的链接域指向插入的下一个节点
node.next = pre_node.next
# 把插入的前一个节点的链接域指向新节点
pre_node.next = node

删除元素

def remove(self, item):
"""删除节点"""
cur = self.head
pre = None
while cur is not None:
# 找到了指定元素
if cur.item == item:
# 如果第一个就是删除的节点
if not pre:
# 将头指针指向头节点的后一个节点
self.head = cur.next
else:
# 将删除位置的前一个节点的next指向删除位置的后一个节点
pre.next = cur.next
return
else:
# 继续按链表后移节点
pre = cur
cur = cur.next
else:
raise ValueError('Can not find the item!')

查找节点是否存在

def search(self, item):
"""链表查找节点是否存在,并返回true或者false"""
cur = self.head
while cur is not None:
if cur.item == item:
return True
cur = cur.next
return False

测试

if __name__ == '__main__':
lst1 = SingleLinkList()
lst1.append(1)
lst1.append('a')
lst1.add(0)
lst1.insert(2, 'h')
print('length:', lst1.length()) # length: 4
lst1.travel() # 0 1 h a
lst1.remove(1)
lst1.remove('h')
print('length:', lst1.length()) #
lst1.travel() # 0 a
print(lst1.is_empty()) # False

用python实现单向链表的更多相关文章

  1. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  2. python数据结构——单向链表

    链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...

  3. python实现单向链表

    #Definition for singly-linked list. class ListNode(object): def __init__(self, x): self.val = x self ...

  4. Python的单向链表实现

    思路 链表由节点组成,先规定节点(Node),包含data和指向下个节点的next 初始化 data当然就是传入的data了,next指向None 添加 分两种情况: 链表为空,那么头节点和尾节点都指 ...

  5. Python—构造单向链表数据类型

    # _*_ coding=utf-8 _*_ class Node: """ 创建链表的属性 """ def __init__(self, ...

  6. Python3玩转单链表——逆转单向链表pythonic版

    [本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...

  7. python数据结构链表之单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  8. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  9. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

随机推荐

  1. Android 程序优化总结

    第一部分 编程规范 1.1 基本要求: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行. 打算干什么,要简单,直接. 尽量使用标准库函数和公共函数 不要随意定义全局变量,尽量使用局部变量. ...

  2. 【BZOJ4771】七彩树(主席树)

    [BZOJ4771]七彩树(主席树) 题面 BZOJ 题解 如果没有深度限制,每次只询问子树内的颜色个数,除了树套树\(dfs\)序加前驱或者后继强行二维数点之外,还有这样一种做法: 把所有相同颜色的 ...

  3. [2017-7-28]Android Learning Day7

    View动画效果 透明动画效果 旋转动画效果 移动动画效果 缩放动画效果 混合动画效果 1.透明动画效果(AlphaAnimation) 有两种方法 第一种在活动中设置,不需要xml文件 public ...

  4. [TJOI2015]线性代数(最小割)

    题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 题解 观察上面那个式子发现,当一个bij有贡献时当 ...

  5. 定时器同步+触发三ADC采样+输出6路PWM波

    为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ...

  6. 20165223 week1测试查漏补缺

    week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...

  7. jquery $().each,$.each的区别

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法. 两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. 一,$().each $().ea ...

  8. 【洛谷P2568】GCD

    题目大意:给定整数 \(N\),求\(1\le x,y\le N\) 且 \(gcd(x,y)\) 为素数的数对 \((x,y)\) 有多少对. 题解: \[ \sum_{p \in \text { ...

  9. IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法

    在使用下面这个写法时候UTF-8文件编码 在读取时候出现乱码问题. File myFile=new File("文件路径"); BufferedReader in = new Bu ...

  10. NLog类库使用探索——编程配置

    以编程的方式配置,这是我项目中的,我都不知道为什么使用编程.直接配置不很好吗,估计他也没有研究.直接上步骤和代码: 创建一个LoggingConfiguration对象,用来保存配置信息 至少创建一个 ...