基于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 ...
随机推荐
- 下载EXCEL格式设置
1)文本:vnd.ms-excel.numberformat:@2)日期:vnd.ms-excel.numberformat:yyyy/mm/dd3)数字:vnd.ms-excel.numberfor ...
- SpringCloud-config分布式配置
为什么要统一管理微服务配置? 随着微服务不断的增多,每个微服务都有自己对应的配置文件.在研发过程中有测试环境.UAT环境.生产环境,因此每个微服务又对应至少三个不同环境的配置文件.这么多的配置文件,如 ...
- IT人35岁危机:到底是因为爱还是责任?
互联网蚕食世界,未来属于IT人. 这是属于互联网的时代,每个人都是网络的弄潮儿,由于网络越来越被需要,互联网IT行业被推上了较高的位置,这也导致IT行业的就业环境火热,越来越多的人被IT行业广阔的发展 ...
- 规则引擎在IoT的重要性?
前言 物联网的强大功能主要来自于它使我们能够实时做出更准确的决策的能力,这些在通知.自动化和预测性维护上都有所体现.因此我们需要能对实时数据进行实时响应的工具,答案就是规则引擎.规则引擎可以通过摄取实 ...
- C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色
在医生阅片确诊的过程中,当发线疑似病灶时在灰度显示下有时并不清晰,这时候就需要色彩增强效果来使灰度图像变为彩色图像. LUT可以简单的理解为0-255的颜色映射值,例如:彩虹编码,将其打包成LUT格式 ...
- 5.Selector详解
- TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
开源的 TypeScript 也曾在微软内部遭到抵制,但如今 TypeScript 已经成为 Web 应用构建的主流语言. 微软的开源编程语言 TypeScript 是 JavaScript 的一 ...
- MySQL中的find_in_set()函数使用技巧心得与应用场景总结
Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 企业博客 CSDN.com 个人博 ...
- 每日爬虫JS小逆之5分钟旅游网MD5一锅端
来吧骚年,每天花5分钟锻炼一下自己的JS调试也是极好的,对后期调试滑块验证码还原.拖动很有帮助,坚持下去,我们能赢.建议亲自试试哦,如果对大家有帮助的话不妨关注一下知识图谱与大数据公众号,当然不关注也 ...
- 基于C#的内网穿透学习笔记(附源码)
如何让两台处在不同内网的主机直接互连?你需要内网穿透! 上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过nat会转换成 ...