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. Vue下路由History mode 出现404,无法正常刷新

    在History mode下,如果直接通过地址栏访问路径,那么会出现404错误,这是因为这是单页应用(废话)-其实是因为调用了history.pushState API 所以所有的跳转之类的操作都是通 ...

  2. FIS本地发布-其他同事通过IP访问

    方法很简单,只需在fis的配置文件那里进行修改即可. 文件路径在 C:\Users\Su\AppData\Roaming\npm\node_modules\fis\node_modules\fis-c ...

  3. 我选择了MySQL和SpringData JPA

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 今天想跟大家聊聊数据库层面上的事,austin项目继续更新(注:今天聊的数据库都特指关系型数据库) 01.数据库选择 ...

  4. WebRTC本地选择codec(web本地模拟)

    视频编码后,再进行发送.WebRTC建立视频连接前,可以选择codec.一般来说支持多种codec,以VP8和H264为代表. Codec: 编码译码器,编解码器 示例代码 写一个示例,用户可以在发送 ...

  5. 【Java】eclipse中的JUnit单元测试

    eclipse中的JUnit单元测试 步骤: 选中当前工程 - 右键选择:build path - add libraries - JUnit 4 - 下一步 创建Java类,进行单元测试. 此时的J ...

  6. Java库中的LocalDate类

    Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...

  7. 在KALI以外的Linux上安装KALI上的工具(ubuntu,debian)

    添加KALI源 vim /etc/apt/sources.list 在sources.list中加入 deb http://http.kali.org/kali kali-rolling main c ...

  8. 《剑指offer》面试题64. 求1+2+…+n

    问题描述 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示 ...

  9. .NET下如何拦截鼠标、键盘消息?Win32NET来帮你

    Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...

  10. porcupine语音唤醒python实现

    note it is not for arm pyaudio <= 3.6 version porcupine 3.5 3.6 not 3.7 code import struct import ...