Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园]
链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表。
单向链表中的节点不光有代表方向的指针变量,也有值变量。所以我们定义链表,就是要定义链表中的节点,对链表的操作最后也就是对节点的操作。
这些包含数据的节点们在一种指定的结构下连接起来,成为了一种数据结构——单向链表。以上是我对单向链表的理解。
以下是我用python3对单向链表这种数据结构的一种实现,其中我用到了生成器来完成逆转单向链表这一操作,非常pythonic啊!代码如下:
'''
Python版单向链表-单向链表简称单链表
单链表中所包含的基本操作:
初始化
创建
链表生成器
打印
显示调用过程
计算长度
判空
获取
删除
插入
修改
追加
逆转单向链表
''' class Node(object):
# 节点初始化
def __init__(self, value, p=None):
self.value = value
self.next = p class LinkList(object):
# 初始化单链表
def __init__(self):
self.head = None # 创建单链表
def create(self, node_value_list):
self.head = Node(node_value_list[0])
p = self.head
for i in node_value_list[1:]:
p.next = Node(i)
p = p.next # 生成单链表
def generate(self):
p = self.head
while p != None:
yield p.value
p = p.next # 打印单链表
def print(self):
print([i for i in self.generate()]) # 显示方法调用前后的单链表
def show(func):
def wrapper(self, *args):
print("方法{func_name}执行前".format(func_name=func.__name__))
self.print()
print("方法{func_name}执行中".format(func_name=func.__name__))
func(self, *args)
print("方法{func_name}执行后".format(func_name=func.__name__))
self.print() return wrapper # 获取单链表的长度
def length(self):
p = self.head
length = 0
while p != None:
length += 1
p = p.next
return length # 判断单链表是否为空
def is_null(self):
return self.length() == 0 # 获取单链表偏移位元素返回并打印其节点值
# 支持顺序索引和逆序索引:0代表索引0位,-1代表倒数第一位,-2代表倒数第二位
# 获取不存在的位返回None
def get(self, offset):
p = self.head
index = 0
length = self.length()
if offset > length - 1:
print(None)
return None
if offset < 0 and offset + length < 0:
print(None)
return None
if offset < 0 and offset + length >= 0:
offset = length + offset
while index < length - 1 and index < offset:
p = p.next
index += 1
print("获取索引{index}位节点-值为{value}".format(index=index, value=p.value))
return p # 删除单链表偏移位元素并打印
# 支持顺序索引和逆序索引:0代表索引0位,-1代表倒数第一位,-2代表倒数第二位
# 删除不存在的位返回None
@show
def remove(self, offset):
p = self.head
length = self.length()
index = 0
if offset > length - 1:
print(None)
return None
if offset == 0 or offset + length == 0:
print("删除索引{index}位节点-值为{value}".format(index=index, value=self.head.value))
self.head = p.next
return None
if offset < 0 and length + offset > 0:
offset = length + offset
while index < length - 1 and index < offset - 1:
p = p.next
index += 1
print("删除索引{index}位节点-值为{value}".format(index=index + 1, value=p.next.value))
p.next = p.next.next # 在指定index位插入节点-值为value
# 什么是插入——在两个节点之间加入才叫插入
# 所以在末尾插入的意思就是在索引倒数第二位和倒数第一位之间插入
@show
def insert(self, offset, value):
length = self.length()
# 如果偏移量对应的索引位不在链表对应索引位范围内-返回None
if offset > length - 1 or offset + length < 0:
return None
if offset < 0:
offset = offset + length
node = Node(value)
if offset == 0 or offset + length == 0:
p = self.head
self.head = node
node.next = p
else:
previous_node = self.get(offset - 1)
current_node = self.get(offset)
previous_node.next = node
node.next = current_node
print("在索引{index}位插入节点-值为{value}".format(index=offset, value=value)) # 在链表索引末位追加一个节点-值为value
@show
def append(self, value):
last_node = self.get(self.length() - 1)
last_node.next = Node(value) # 修改链表索引位节点值
@show
def modify(self, offset, value):
self.get(offset).value = value # 逆向生成单向链表
@show
def reverse(self):
# 将节点生成器转变为列表并逆序
reverse_list = [i for i in self.generate()][::-1]
self.head = Node(reverse_list[0])
p = self.head
for i in reverse_list[1:]:
p.next = Node(i)
p = p.next if __name__ == '__main__':
list = [1, 2, 33, 4, 55, 6, 76, 78]
# 初始化链表
link_list = LinkList()
# 创建链表
link_list.create(list)
# 获取节点
link_list.get(-1)
# 删除节点
link_list.remove(0)
# 插入节点
link_list.insert(-2, 0.2)
# 末位追加节点
link_list.append(3)
# 修改节点值
link_list.modify(-1, 666)
# 逆转
link_list.reverse()
Python3玩转单链表——逆转单向链表pythonic版的更多相关文章
- 逆转单向链表看这一篇就够了【JAVA】
逆转单向链表 逆转前: 1 -> 2 -> 3 -> 4 -> 5 -> null 逆转后: 5 -> 4 -> 3 -> 2 -> 1 -> ...
- 《Java数据结构》链表结构(单向链表,双向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
- C++实现企业链表(单向链表的另外一种实现方式)
LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...
- python中的单向链表实现
引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...
- JAVA单向链表实现
JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...
- C 单向链表就地逆转
1.问题描述 给定一个单链表L,设计函数Reverse将L就地逆转.即不需要申请新的节点,将第一个节点转换为最后一个结点,第二个节点转换为倒数第二个结点,以此类推. 2.思路分析 循环处理整个链表.将 ...
- PTA 6-1 单链表逆转
本题是一个非常经典的题目:单链表逆转. 这是链表结点的定义: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储 ...
随机推荐
- C语言学习笔记 (008) - C语言字符串操作总结大全(超详细)(转)
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...
- linux达人养成计划学习笔记(五)—— 关机和重启命令
一.shutdown 1.格式: shutdown [选项] 时间(now) 选项: -c: 取消前一个关机命令 -h: 关机 -r: 重启 2.程序放入后台执行: shutdown -r 时间 &a ...
- k8s之Service
一.概述 在k8s中暴露Service访问(无论内部还是外部),都要经过kube-proxy: 如下图:
- 使用iTextSharp修改PDF文件(一)
这个iTextSharp确实是个好东西,可以创建.读取PDF格式的文档,虽然我的需求比较简单,但我首先还是基本上.完整地看完了它的相关文档,不喜欢英文的同志,可以搜索一篇<用C#制作PDF文件全 ...
- 【java】深入了解JAVA可变长度的参数
到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法——因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时 ...
- android 一步一步教你集成tinker(热修复)
这几天闲着没事,就看了下现在比较火的热修复,确实有了热修复就解决了android native的一个很尴尬问题,之前比起h5,android在用户体验上是有优势,但是过于复杂的版本更新,使用户烦不胜烦 ...
- C++虚函数工作原理
一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table poi ...
- Android Developers:支持不同的屏幕密度
这节课程向你展示如何通过提供不同的资源和使用与分辨率无关的测量单位,支持不同屏幕密度. 使用密度无关的像素 —————————————————————————————————————————————— ...
- Vue 点击波浪特效指令
- Flowable 的event介绍
1 事件分为两种,一种是抛出:当流程执行到这时,抛出一个事件:另一种是捕获:当流程执行到这时,他就会等待一个事件的发生. 一个事件需要有事件定义,否则不会做任何“特殊”的事.对于一个流程实例,一个开始 ...