单向链表

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

  • 表元素域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. 【APIO2018】新家(线段树)

    [APIO2018]新家(线段树) 题面 UOJ 洛谷 BZOJ 题解 论比赛时想不到二分的危害,就只能Cu滚粗 既然不要在线,那么考虑离线做法. 既然时间是区间,那么显然按照时间顺序处理答案. 显然 ...

  2. HDU/HDOJ 4699 Editor

    对顶栈算法. 此题充分说明了cin的不中以及scanf的优越性. 我TM用cin超时了!!!换成scanf就A了!!! #include <cstdio> #include <cst ...

  3. poj3630 Phone List

    spy on一下,发现是trie裸题,结果一交就T... 然后把cin改成scanf就A了... trie的空间一定要开足,要不然RE #include <cstdio> #include ...

  4. jquery.form.js ajax提交上传文件

    项目中最近有用到表单提交,是带有图片上传的表单录入,需要ajax异步提交,网上找了好多例子都是只能提交上传字段一个信息的,这里整理一下.表单里有普通文本信息字段也有图片上传字段. 1.jsp代码--引 ...

  5. 查看android源码,windows环境下载源码

    查看源码 参考: http://blog.csdn.net/janronehoo/article/details/8560304 步骤: 添加chrome插件 Android SDK Search 进 ...

  6. 数据库日志redo和undo

    数据库的ACID属性 Atomicity:原子性,以事物transact为最小单位,事物中的所有操作,要么都执行完,要么都不执行,不存在一部分操作执行,另一部分操作不执行的情况. Consistenc ...

  7. (贪心 线段不相交问题)codeVs 1214 线段覆盖

    题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段 ...

  8. go的net/http用法

    http包提供了HTTP客户端和服务端的实现 一:http客户端的几种方法 1. func (c *Client) Get(url string) (resp *Response, err error ...

  9. Ajxa验证用户和二级联动的实例(五)

    验证用户: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  10. Storm中重要对象的生命周期

    Spout方法调用顺势 declareOutputFields()(调用一次) open() (调用一次) activate() (调用一次) nextTuple() (循环调用 ) deactiva ...