python数据结构链表之单向链表
单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域elem用来存放具体的数据。
- 链接域next用来存放下一个节点的位置(python中的标识)
- 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
节点实现
- class Node(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 = 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,end = ' ')
- cur = cur.next
- print("")
头部添加元素
- def add(self, item):
- """头部添加元素"""
- # 先创建一个保存item值的节点
- node = Node(item)
- # 将新节点的链接域next指向头节点,即_head指向的位置
- node.next = self.__head
- # 将链表的头_head指向新节点
- self.__head = nod
尾部添加元素
- def append(self, item):
- """尾部添加元素"""
- node = Node(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 = Node(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
python数据结构链表之单向链表的更多相关文章
- 《Java数据结构》链表结构(单向链表,双向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
- Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 数据结构——Java实现单向链表
结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...
- Python手写模拟单向链表对象,栈对象和树
单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...
- JS数据结构与算法--单向链表
链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...
- 线性数据结构案例1 —— 单向链表中获取倒数k个节点
一.介绍 先遍历整个链表获取链表长度length,然后通过 (length-index) 方式得到我们想要节点在链表中的位置. 二.代码 public Node findLastIndexNode( ...
- C++实现企业链表(单向链表的另外一种实现方式)
LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...
- python中的单向链表实现
引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...
随机推荐
- nodejs - 守护进程 supervisor
1. 安装 npm -g install supervisor 2. 如果使用了expres框架 需要修改启动方式 到 package.json中的 "scripts&quo ...
- java(5)循坏结构
一. while循环 1.循环的优点? 减少重复代码的编写:程序会更加的简洁 2.语法 while(表达式){ // 1.表达式是[循环条件],结果必须是boolean类型 //2.{}中的代码,即[ ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
- 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)
前言: nodejs提供了cluster集群(支持端口共享的多进程),cluster基于child_process,process二次封装,方便我们使用该功能实现单机nodejs的web集群. 1.c ...
- docker疑难解答 -- 设置远程服务监听
环境: ubuntu 16.04 tls docker version 17.05.0-ce ========================= 今天想要搭建一个多主机的集成docker环境,但是我最 ...
- 定期清空log文件
# auto-del-log.sh #!/bin/shfor i in `find . -name "*.out" -o -name "*.log"`do c ...
- vue 高德地图之玩转周边
前言:在之前的博客中,有成功引入高德地图,这是以前的地址 vue 调用高德地图. 因为一些需求,需要使用到地图的周边功能. 完整的项目代码请查看 我的github 一 .先看要实现的结果,参考了链 ...
- Java中的static、final关键字
static static 的含义是静态的,是一个静态修饰符,一般来说,被static修饰的有以下几种,类.变量.方法.代码块. static修饰类 Java中普通的类是不允许被声明为静态的,但是有一 ...
- (cljs/run-at (->JSVM :browser) "语言基础")
前言 两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索.而近一两年来又刮起了函数式编程的风潮,恰逢有幸主理新项目的前端架构,于是引入Ramda. ...
- 本地存储 web storage
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...