单向链表

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

  • 表元素域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数据结构链表之单向链表的更多相关文章

  1. 《Java数据结构》链表结构(单向链表,双向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

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

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

  3. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  4. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  5. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  6. JS数据结构与算法--单向链表

    链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...

  7. 线性数据结构案例1 —— 单向链表中获取倒数k个节点

    一.介绍  先遍历整个链表获取链表长度length,然后通过 (length-index) 方式得到我们想要节点在链表中的位置. 二.代码 public Node findLastIndexNode( ...

  8. C++实现企业链表(单向链表的另外一种实现方式)

    LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...

  9. python中的单向链表实现

    引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...

随机推荐

  1. SQLalchemy模块用法

    安装 pip install sqlalchemy #!/usr/bin/env python # -*- coding:utf-8 -*- # 加载模块 from sqlalchemy.ext.de ...

  2. win10下面visual studio, sublime ctrl+shift+f快捷键失效的原因

    在visual studio 和sublime中,经常遇到ctrl+shift+f不能用,然后输入法总是自动切换成繁体中文. 实在百思不得其解. 今天才发现,我用的windows 10自带的微软拼音输 ...

  3. Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建

    http://blog.csdn.net/u013142781/article/details/50380920

  4. js对手机软键盘的监听

    js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和f ...

  5. Java基础——继承

    学习Java继承之前,我们想回忆一下Java面向对象需要特别注意的几个关键点. 面向对象是将复杂的事情简单化了,它通过封装的方式使得代码的重用性更高和安全性更强.平时我们要学会用面向对象的方式去思考, ...

  6. HttpWebRequest操作已超时

    最近我们使用.NET3.5HttpWebRequest会报操作已超时但使用.NET4.0版本及以上却可以正常访问. 一段简单的代码如下: string returnData = "" ...

  7. Jenkin-持续集成

    1.Jenkins安装 本文将会介绍如何在windows 中安装Jenkins,并且使用Jenkins进行项目的构建. 首先我们进入到Jenkins 的官网下载地址:https://jenkins.i ...

  8. Swift3 访问权限fileprivate和 open

    在swift 3中新增加了两种访问控制权限 fileprivate和 open. 下面结合网上资料和个人理解整理一下两个属性的原理与介绍. fileprivate 在原有的swift中的 privat ...

  9. Linux网络编程“惊群”问题总结

    1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ...

  10. 批量自动更新SVN版本库 - Windows

    开发过程中每天都要从SVN代码库里一个一个的update各个项目代码,不仅效率实在是低,也不符合程序员的"懒"精神,由于是在Windows环境做开发,自然就想到了使用bat来实现自 ...