1 # 创建一个节点类
2 class Node:
3 def __init__(self, item):
4 self.item = item
5 self.next = None
6
7
8 # 创建一个单链表类
9 class SingleLink:
10 def __init__(self):
11 self.header = None # 初始化单链表的头结点
12 self.length = 0 # length:单链表的长度
13
14 # 判断单链表是否为空
15 def is_empty(self):
16 if self.header is None:
17 return True
18 else:
19 return False
20
21 '''
22 实现向单链表添加元素的功能:
23 有三种实现方式:
24 1.头插法
25 2.尾插法
26 3.从任意指定位置添加元素
27 '''
28
29 # 1.头插法
30 def preadd(self, value):
31 node = Node(value)
32 if self.is_empty():
33 self.header = node
34 else:
35 node.next = self.header
36 self.header = node
37 self.length += 1
38
39 # 2.尾插法
40 def append(self, value):
41 node = Node(value)
42 cur = self.header
43 while cur.next is not None:
44 cur = cur.next
45 cur.next = node
46 self.length += 1
47
48 # 3.从任意指定位置添加元素
49 def insert(self, index, value):
50 node = Node(value)
51 cur = self.header
52 if index <= 0:
53 self.preadd(value)
54 self.length += 1
55 elif index > self.length:
56 self.append(value)
57 self.length += 1
58 else:
59 for i in range(1, index - 1):
60 cur = cur.next
61 node.next = cur.next
62 cur.next = node
63 self.length += 1
64
65 '''
66 实现从单链表中删除元素的功能
67 有三种删除方式:
68 1.根据指定位置来删除元素
69 2.直接删除元素
70 3.清空单链表
71 '''
72
73 # 1.根据指定位置来删除元素
74 def __delitem__(self, index):
75 if index <= 0 or index > self.length:
76 raise IndexError
77 if index == 1:
78 self.header = self.header.next
79 else:
80 cur = self.header
81 for i in range(1, index - 1):
82 cur = cur.next
83 cur.next = cur.next.next
84 self.length -= 1
85
86 # 2.直接删除元素
87 def __delete__(self, value):
88 self.__delitem__(self.isExist(value))
89 self.length -= 1
90
91 # 3.清空单链表
92 def clear(self):
93 while self.length != 0:
94 self.__delitem__(self.length)
95 self.length -= 1
96 '''
97 实现修改元素的功能
98 1.修改指定位置的元素
99 '''
100 # 1.修改指定位置的元素
101 def __setitem__(self, index, value):
102 cur=self.header
103 if not isinstance(index,int):
104 raise TypeError
105 if 0<index<self.length:
106 for i in range(index-1):
107 cur=cur.next
108 cur.item=value
109 else:
110 print('您输入的信息有误!')
111 '''
112 实现对单链表的查找功能
113 有三种实现方式:
114 1.查找某元素,并返回其在链表中的位置
115 2.根据位置来查找对应的元素
116 3.遍历单链表,查找出所有元素
117 '''
118
119 # 1.查找某元素,并返回其在链表中的位置
120 def isExist(self, value):
121 cur = self.header
122 for i in range(self.length):
123 if cur.item == value:
124 return i + 1
125 cur = cur.next
126
127 # 2.根据位置来查找对应的元素
128 def __getitem__(self, index):
129 cur = self.header
130 if index <= 0 or index > self.length:
131 return print('您输入的信息有误')
132 for i in range(index - 1):
133 cur = cur.next
134 return print('第%d个位置的元素是%d' % (index, cur.item))
135
136 # 3.遍历单链表,查找出所有元素
137 def show(self):
138 cur = self.header
139 if self.length == 0:
140 print('目前单链表中没有数据!')
141 else:
142 print('目前单链表的元素有:', end=' ')
143 for i in range(self.length):
144 print('%s' % cur.item, end=' ')
145 cur = cur.next
146 print('\n')
147
148
149 if __name__ == '__main__':
150 s = SingleLink()
151 s.preadd(12)
152 s.preadd(23)
153 s.preadd(32)
154 s.show()
155 s.append(14)
156 s.append(43)
157 s.append(15)
158 s.show()
159 print('元素32在单链表的第%d个位置' % s.isExist(32))
160 print('从第三个位置插入元素:57')
161 s.insert(3, 57)
162 s.show()
163 print('删除第一个位置的元素')
164 s.__delitem__(1)
165 s.show()
166 print('直接删除元素43:')
167 s.__delete__(43)
168 s.show()
169 s.__getitem__(2)
170 s.__setitem__(3,9000)
171 s.show()
172 print('清空单链表:')
173 s.clear()
174 s.show()

Python实现不带头结点的单链表的更多相关文章

  1. java编写带头结点的单链表

    最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

  2. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  3. 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。

    /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...

  4. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  5. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  6. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  7. 不带头结点的单链表------C语言实现

    File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

  8. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  9. 不带头结点的单链表递归删除元素为X的结点

    #include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList ...

随机推荐

  1. Python 国内镜像源

    让 python pip 使用国内镜像源 国内镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.co ...

  2. println打印的原理

    由于out是System类中的一个不可变的变量 println方法在PrintStream类中 并且在打印都时候都会转换成字符串

  3. 友善之臂mini2440光盘资料下载FriendlyARM-2440-DVD.7z

    这是我目前找到最全面的友善之臂mini2440的光盘资料了,几乎支持mini2440的各种lcd屏幕.另外,Windows平台工具文件夹下还有版本比较新的MiniTools,这是一个非常好用的软件! ...

  4. Sentry 开发者贡献指南 - 测试技巧

    作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...

  5. 【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)

    1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...

  6. CAS基础

    有锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一 ...

  7. openssl基本原理 + 生成证书(转)

    https://blog.csdn.net/cpcpcp123/article/details/108885922 https://liruzhen.blog.csdn.net/article/det ...

  8. golang中文件和路径用法

    package main import ( "fmt" "io/fs" "io/ioutil" "os" "p ...

  9. Telegra.ph | 简洁的文章发布平台

    https://telegra.ph 自由 Telegraph 并不强调内容管理方这一概念,真正做到了「人人都是媒体」.通过 Telegraph 发布的文章,理论上来说不会存在删除的危险,并且由于会产 ...

  10. 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...