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. Java实现打开google浏览器

    说明: 博主的Google浏览器版本:75.0.3770.142,如果运行异常,需要自行查找对应版本的驱动(chromedriver.exe) 需要的jar包: https://pan.baidu.c ...

  2. Apache Hudi异步Compaction方式汇总

    本篇文章对执行异步Compaction的不同部署模型一探究竟. 1. Compaction 对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件 ...

  3. pytest测试框架 -- assert断言和fixture固件

    一.断言 (1)使用assert语句进行断言 # test_run.py @pytest.mark.assert def test_assert(self): r = requests.get(&qu ...

  4. CTF-WeChall-第一天

    2020.09.09 今天来了一个新平台,WeChall,从简单的开始做,才能找到自信--i春秋的题做自闭了

  5. 基于DDD+微服务的开发实战(1)

    1 DDD是什么? DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有17年. 2 为什么需要DDD 当软件越来越复杂,实际开发中,大量的业务逻辑堆积在一个巨型类中的例子屡见不鲜 ...

  6. Linux实战(8):查看文件大小

    du -sh *

  7. Autofac的使用

    Autofac的使用 「Autofac简介」 「基本的使用方式」 「如何实现webapi控制器自动注入接口」 一.Autofac简介 ❝ Autofac是实现依赖注入的类库之一,他可以帮助你实现程序的 ...

  8. netty之pipeline

    转载自https://blog.csdn.net/zxhoo/article/details/17264263 Netty4学习笔记(1)-- ChannelPipeline Netty4Netty是 ...

  9. 缓动公式整理(附:C#实现及WPF原版对比)

    前言 缓动在动画效果中应用非常广泛,在合适的时候使用一些缓动效果会使得效果更加符合人的直观感受,简单来说,会显得更加自然. WPF提供了11种缓动效果,涵盖了大部分的使用场景.不过如果需要在非WPF下 ...

  10. 关于取整函数ceil(),floor(),round()函数得应用

    ceil()返回向上取整最接近的整数. double ceil(double); floor()返回向下取整最接近的整数. double floor(double); round()用于对浮点数的四舍 ...