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实现单链表代码的更多相关文章

  1. Python实现单链表数据的添加、删除、插入操作

    Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...

  2. python实现单链表反转(经典笔试题)

    https://blog.csdn.net/su_bao/article/details/81072849 0.说在前面的话 链表结构,说难不难,说易不易,一定要亲自编程实现一下.其次就是一定要耐心, ...

  3. java单链表代码实现

    用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...

  4. VS环境下基于C++的单链表实现

    ------------恢复内容开始------------ #include<iostream> using namespace::std; typedef int ElemType; ...

  5. C#基于引用创建单链表

    在C语言,单链表的实现依赖指针,指针用来指向节点,那么,用C#实现,自然就想到引用,节点的引用不就类似于指向Node的指针嘛

  6. 数据结构与算法-python描述-单链表

    # coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元 ...

  7. python实现单链表及链表常用功能

    单链表及增删实现 单链表高级功能实现:反序,找中间结点,检测环等 参考: https://github.com/wangzheng0822/algo

  8. python实现单链表的翻转

    #!/usr/bin/env python #coding = utf-8 class Node:     def __init__(self,data=None,next = None):      ...

  9. 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 ...

随机推荐

  1. 难道主键除了自增就是GUID?支持k8s等分布式场景下的id生成器了解下

    背景 主键(Primary Key),用于唯一标识表中的每一条数据.所以,一个合格的主键的最基本要求应该是唯一性. 那怎么保证唯一呢?相信绝大部分开发者在刚入行的时候选择的都是数据库的自增id,因为这 ...

  2. python urllib.request

    一.简介 urllib.request 模块提供了访问 URL 的相关功能 二.常用函数 urllib.request.urlopen("http://httpbin.org", ...

  3. 163net邮箱,对商务办公人士有哪些帮助?

    在职场当中,无论是沟通交流,还是文档对接,电子邮箱都是是必不可少的办公助手,163net付费邮箱作为很多人的首选工作邮箱,相较于免费邮箱而言,究竟有哪些优势呢?        1. 专属网络空间,有容 ...

  4. IDEA里如何引入JQuery

    HTML页面的JavaScript里一般可以直接使用类似:<script src="js/jquery.js"></script>语句可以直接引入,但是会遇 ...

  5. Burp Suite抓包使用步骤

    Burp Suite抓包工具的操作步骤见安装步骤那篇博客 检查是否存在漏洞,就看拦截之后修改过的数据是否写进了数据库 举例一.上传文件 1.打开Burp.调整Proxy-Intercept-Inter ...

  6. C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

    概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...

  7. Envoy 代理中的请求的生命周期

    Envoy 代理中的请求的生命周期 翻译自Envoy官方文档. 目录 Envoy 代理中的请求的生命周期 术语 网络拓扑 配置 高层架构 请求流 总览 1.Listener TCP连接的接收 2.监听 ...

  8. nioServerChannel的的状态

    转载自https://blog.csdn.net/zxhoo/article/details/17964353 Channel继承层次图分析上面提到的三个状态的时候,会去看Channel继承层次里某些 ...

  9. pytest自学第二期

    2.1 通过python解释器调用 pytest 我不知道有什么用:-) 以后就这样,如果有自己学过但是不知道的东西,就挂在那里晒着鞭尸,一直不会就一直鞭尸,直到自己参透了其中的道理再回到这里补全 在 ...

  10. 从CPU缓存看缓存的套路

    一.前言 不同存储技术的访问时间差异很大,从 计算机层次结构 可知,通常情况下,从高层往底层走,存储设备变得更慢.更便宜同时体积也会更大,CPU 和内存之间的速度存在着巨大的差异,此时就会想到计算机科 ...