基于python实现单链表代码
1 """
2 linklist.py
3 单链表的构建与功能操作
4 重点代码
5 """
6
7 class Node:
8 """
9 思路:将自定义的类视为节点的生成类,
10 实例对象中包含数据的部分和下一个节点的next
11 """
12 def __init__(self,val,next = None):
13 self.val = val # 有用数据
14 self.next = next # 循环下一个节点的关系
15
16 # node1 = Node(1)
17 # node2 = Node(2,node1)
18 # node3 = Node(3,node2)
19
20 class LinkList:
21 """
22 思路:单链表类,生成对象可以进行增删改查操作
23 具体操作通过调用具体方法完成
24 """
25 def __init__(self):
26 """
27 初始化链表,标记一个链表的开端,以便于获取后续的值
28 """
29 self.head = Node(None) # 定义开端
30 # 通过为list_为链表添加一组节点
31 def init_list(self,list_):
32 p = self.head # p 作为移动变量
33 for item in list_:
34 p.next = Node(item)
35 p = p.next
36
37 # 遍历链表
38 def show(self):
39 p = self.head.next # 第一个有限节点
40 while p is not None:
41 print(p.val)
42 p = p.next # p 向后移动
43
44 # 判断链表为空
45 def is_empty(self):
46 if self.head.next is None:
47 return True
48 else:
49 return False
50
51 # 清空链表 断开head
52 def clear_linklist(self):
53 self.head.next = None
54
55 # 增加节点
56 def add_node(self):
57 """ 链表不在尾部增加,因为要遍历到尾部
58
59 """
60 pass
61
62 # 尾部插入节点,比列表插入慢
63 def insert_end(self,val):
64 p = self.head
65 while p.next is not None:
66 p = p.next
67 p.next = Node(val)
68
69 # 头部插入,速度快
70 def insert_head(self,val):
71 node = Node(val) # 1.新建节点
72 node.next = self.head.next # 新节点指向原第二节点
73 self.head.next = node # head 节点
74
75 # 指定插入 难度***
76 def insert_appoint(self,index,val):
77 # 注意循环的临界问题,和头部插入类似
78 p = self.head
79 for i in range(index):
80 # 如果index 值过大,退出循环
81 if p.next is None:
82 break
83 p = p.next
84 node = Node(val)
85 node.next = p.next
86 p.next = node
87
88 # 删除节点 效率比列表快,不需要内存的移动
89 def delete_node(self,x):
90 p = self.head
91 # 结束循环,必定条件有假,先判断是不是none,短路原则
92 while p.next and p.next.val != x:
93 p = p.next
94 if p.next is None:
95 raise ValueError("x not in linklist")
96 else:
97 p.next = p.next.next
98
99 # 获取某个节点的值,传入节点位置,
100 def get_node(self,index):
101 if index < 0: # 判断索引值是否有误
102 raise IndexError("index out of range")
103 p = self.head.next
104 for i in range(index):
105 if p.next is None:
106 raise IndexError("list index out of range")
107 p = p.next
108 return p.val
109
110 # 将第二个列表合并到第一个列表中,正序排列
111 def merge_linklist(list1, list2):
112 """
113 p 指向l1-head,q 指向l2-元素2,p.next值和q比较
114 如果比q小,p向后移动,此时p.next为3,大于2,令中间变量
115 指向p.next,让p指向q,让q等于中间变量,p向后走指向2,重复
116 上述操作,不用开辟第三个链表
117
118 :param l1:
119 :param l2:
120 :return:
121 """
122 p = list1.head # p指向l1头
123 q = list2.head.next # q指向l2的元素2
124 while p.next is not None:
125 if p.next.val < q.val:
126 p = p.next
127 else:
128 # 前两必须标记,后两可以不按顺序
129 tmp = p.next
130 p.next = q
131 p = p.next
132 q = tmp
133 p.next = q
134
135 #------测试代码-------
136 #if __name__ == "__main__":
137 # l = LinkList()
138 # # l.head.next = Node(1)
139 # # print(l.head.next.val) # 1
140 # l.init_list([1,2,3,4,5])
141 # l.show()
基于python实现单链表代码的更多相关文章
- Python实现单链表数据的添加、删除、插入操作
Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...
- python实现单链表反转(经典笔试题)
https://blog.csdn.net/su_bao/article/details/81072849 0.说在前面的话 链表结构,说难不难,说易不易,一定要亲自编程实现一下.其次就是一定要耐心, ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
- VS环境下基于C++的单链表实现
------------恢复内容开始------------ #include<iostream> using namespace::std; typedef int ElemType; ...
- C#基于引用创建单链表
在C语言,单链表的实现依赖指针,指针用来指向节点,那么,用C#实现,自然就想到引用,节点的引用不就类似于指向Node的指针嘛
- 数据结构与算法-python描述-单链表
# coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元 ...
- python实现单链表及链表常用功能
单链表及增删实现 单链表高级功能实现:反序,找中间结点,检测环等 参考: https://github.com/wangzheng0822/algo
- python实现单链表的翻转
#!/usr/bin/env python #coding = utf-8 class Node: def __init__(self,data=None,next = None): ...
- python实现单链表的反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/env python #coding = utf-8 ...
随机推荐
- 阿里云前端路线 | CSS快速掌握
1.1什么是CSS 翻译为“层叠样式表”或者“级联样式表”, 简称样式表. 1.2CSS的主要作用 它主要是用来给HTML网页来设置外观或者样式 外观或者样式:HTML网页中的文字的大小.颜色.字体, ...
- TouchAction实现连续滑动设置手势密码
首先使用工具获取到元素坐标位置,可以看到起始位置是[144,462],终点位置是[576,894] 分析: 该图形可以横竖划分六等分 那么第一个圆中心点的坐标: x=144+(576-144)/6 y ...
- MySQL 8 安装教程(个人版)+创建用户
Mysql 8的安装教程 解压到指定目录如:D:\WinInstall\mysql-8.0.19-winx64这时候你需要在根目录下创建两个文件,分别是data文件夹和my.ini文件,然后使用编辑器 ...
- Docker部署ElasticSearch以及使用
ElasticSearch笔记 1. ElasticSearch前期 1.1 聊聊ElasticSearch的简介 Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引 ...
- 部署cobbler服务器
部署cobbler服务器 1.准备环境使用nat或者仅主机模式,不要使用桥接模式,方式获取的IP不是自己的 2. 配置yum源[epel]name=epelenabled=1gpgcheck=0bas ...
- Centos 7 redis、tomcat、Spring Boot添加开机自启服务
一.redis添加开机自启 1.添加服务配置文件 [root@test system]# vim /etc/systemd/system/redis-server.service 2.服务配置文件内容 ...
- python3 函数的参数
函数的参数 形参(函数定义时) + 实参(函数调用时) 形参:形式参数 在函数的定义处定义的参数,比如def func(参数1, 参数2, 参数3...) 普通参数(位置参数), 默认参数,普通收集参 ...
- JVM学习(七)JMM内存模型
一.什么是JMM 概念:Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能 ...
- xss利用——BeEF#stage2(初始并持续化控制)
全文概览 浏览器攻击方法流程 攻击浏览器一般分为几个阶段,如下图 整个过程分为三个步骤,第一步是初始化控制,第二步是持续控制,第三步是攻击.在第三步中的七个攻击方法是可以交叉的,比如可以同时攻击用户和 ...
- Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除
最近在学习Python,使用pycharm的时候,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模 ...