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. vsconde launch.json配置 调试本地文件

    { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing ...

  2. 算法竞赛——BFS广度优先搜索

    BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...

  3. 手写RPC-简陋版

    前言 最近不小心被隔离,放假思考一番,决定开始在手写序列.这个序列在之前看Nacous和网关源码的时候就有想法,只是一直没落实下来,趁着隔离行动起来. 必备知识介绍 序列化与反序列化 序列化是把对象的 ...

  4. Centos6.9虚拟机环境搭建

    原文链接:https://www.toutiao.com/i6481534700216123918/ 一.准备工具 VMware Workstation CentOS-6.9-x86_64-minim ...

  5. vuex获取数据

    cmd窗口vue add vuex后出现store文件夹,在里面的index.js里面设置state属性,可以在视图页面home.vue文件中获取. 方法1: //在项目当中引入router以后 就多 ...

  6. Jekyll + NexT + GitHub Pages 主题深度优化

    前言 笔者在用 Jekyll 搭建个人博客时踩了很多的坑,最后发现了一款不错的主题 jekyll-theme-next,但网上关于 Jekyll 版的 Next 主题优化教程少之又少,于是就决定自己写 ...

  7. [BZOJ2761] [JLOI2011] 不重复数字 (C++ STL - set)

    不重复数字 题目:         给出N个数,要求把其中重复的去掉,只保留第一次出现的数.例如,给出的数 为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 1 ...

  8. 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释

    题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...

  9. MySQL的学习记录 DAY03~

    小记:昨天打了新冠加强针,今天开始拉肚子,嗓子疼,超级难受~

  10. linux字符编码防止乱码

    一:linux字符编码 en_US.UTF-8 : 美式英文,utf-8 zh_CN.UTF-8 临时优化 export LANG=zh_CN.UTF-8 : 设置编码 永久优化 vim /etc/l ...