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查找指定文件中指定字符的个数

    package lwl.youweb2.test; import java.io.BufferedReader; import java.io.FileReader; import java.io.I ...

  2. 图解选择排序及算法优化(Java实现)

    选择排序 前言 原理:每次循环对比找出最小/大值,将最值的元素交换至左侧 思想:直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并 ...

  3. 图解并发与并行-分别从CPU和线程的角度理解

    本文作为图解java并发编程的第三篇,前2篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 8成以上的java线程状态图都画错了--图解java并发第二篇 一.CPU角度的并发与 ...

  4. Django启动框架自带原始页面(Django一)

    1.安装,cmd中输入命令: pip install django (前提是python已安装完成,才可以使用pip这个python的库管理工具)ps:在cmd中使用pip命令安装时可能因为速度过慢而 ...

  5. pycharm代码中批量粘贴内容的快捷键

    windows电脑中,竖向批量复制的快捷键:Alt

  6. UI中列表

    1.ul.ol.dl

  7. Linux实战(14):Ubuntu修改root默认登陆

    第一步 首先登录系统,创建root用户的密码 在终端输入命令: sudo passwd root 然后输入设置的密码,这样就完成了设置root用户密码的步骤 第二步 修改文件 sudo nano /u ...

  8. openstack核心组件——keystone身份认证服务(5)

    云计算openstack核心组件——keystone身份认证服务(5) 部署公共环境 ntp openstack mariadb-server rabbitmq-server memcache 1.w ...

  9. Node.js 从零开发 web server博客项目[登录]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  10. java基础之序列化

    转载自https://www.cnblogs.com/szlbm/p/5504166.html Java对象表示方式1:序列化.反序列化和transient关键字的作用   平时我们在Java内存中的 ...