02 链表
链表的结构定义
链表是由链节点通过 next 链接而构成的,我们可以先定义一个简单的「链节点类」,再来定义完整的「链表类」。
-
链节点类(即 ListNode 类):使用成员变量 val 表示数据元素的值,使用指针变量 next 表示后继指针。
-
链表类(即 LinkedList 类):使用一个链节点变量 head 来表示链表的头节点。
我们在创建空链表时,只需要把相应的链表头节点变量设置为空链接即可。在 Python 里可以将其设置为 None,其他语言也有类似的惯用值,比如 NULL、nil、0 等。
#ListNode类,链节点类
class ListNode:
def __init__(self,val = None,next = None):
self.val = val
self.next = None
#LinkedList类
class LinkedList:
def __init__(self):
#设置一个头结点
node = ListNode()
#head指向头结点
self.head = node
链表的基本操作
1. 创建一个链表
- 从所给线性表中取出第 1 个数据元素,建立链表头节点。然后依次获取表中的数据元素。
- 每获取一个数据元素,就为该数据元素生成一个新节点,将新节点插入到链表的尾部。
- 插入完毕之后返回第 1 个链节点(即头节点)的地址。
python变量的实质:
当你在Python中创建一个变量时,实际上是在进行以下几个步骤:
内存分配:Python解释器在内存中为变量的值分配空间。
赋值:将一个值存储在分配的内存空间中。
引用:变量名作为引用,指向存储值的内存地址。
作用域:变量的作用域决定了其可见性和生命周期,例如局部变量作用于函数内部,全局变量作用于整个程序。
在python 中没有指针的概念,但与C不同的是python的变量名是对象的引用,即变量名不是对象存储空间的别名而是指向存储空间,这与指针很类似。
#利用python的多重赋值可以快速的实现两个变量值的交换:使用的是拆包的概念,不宜用来解释变量的实质
a = 10
b = 20
a,b = b,a
# a = 20,b = 10
- 这里涉及到一个拆包的概念,将右侧b,a的值自动装在元组中(即(20,10)),左侧a,b对该元组(20,10)进行拆包,分别赋值
# 链表类下的方法
# 根据data初始化一个链表,使用尾插法
def create(self,data):
if not data:
return
cur = self.head
cur = cur.next
for i in range(len(data)):
node = ListNode(data[i])
cur.next = node
cur = cur.next
2. 求链表长度
def length(self):
cur = self.head
cur = cur.next
count = 0
while cur:
count += 1
cur = cur.next
return count
3. 查找元素
#在链表中查找值为val的元素
def find(self,val):
cur = self.head
cur = cur.next
while cur:
if cur.val == val:
return cur
cur = cur.next
return None
4. 插入元素
#在第index个结点前插入结点
def insertNode(self,index,val):
if index < 1:
return 'Error'
count = 0
cur = self.head
while cur and count < index-1:
count += 1
cur = cur.next
node = ListNode(val)
node.next = cur.next
cur.next = node
5. 删除元素
#删除第index个结点
def remove(self,index):
cur = self.head
if cur.next == None or index < 1:
return 'Error'
count = 0
while cur and count < index - 1:
count += 1
cur = cur.next
delNode = cur.next
cur.next = delNode.next
综合代码及测试
class ListNode:
def __init__(self,val = None,next = None):
self.val = val
self.next = None
class LinkedList:
def __init__(self):
node = ListNode()
self.head = node
def create(self,data):
if not data:
return
cur = self.head
for i in range(len(data)):
node = ListNode(data[i])
cur.next = node
cur = cur.next
def length(self):
cur = self.head
cur = cur.next
count = 0
while cur:
count += 1
cur = cur.next
return count
def insertNode(self,index,val):
if index < 1:
return 'Error'
count = 0
cur = self.head
while cur and count < index-1:
count += 1
cur = cur.next
node = ListNode(val)
node.next = cur.next
cur.next = node
#删除第index个结点
def remove(self,index):
cur = self.head
if cur.next == None or index < 1:
return 'Error'
count = 0
while cur and count < index - 1:
count += 1
cur = cur.next
delNode = cur.next
cur.next = delNode.next
data = [3,2,6,5,4]
ls = LinkedList()
print("----创建单链表----")
ls.create(data)
cur = ls.head
cur = cur.next
cur1 = cur
print("length:",ls.length())
while cur:
print(cur.val)
cur = cur.next
print("----插入结点----")
ls.insertNode(2,9)
cur = ls.head
cur = cur.next
cur1 = cur
print("length:",ls.length())
while cur:
print(cur.val)
cur = cur.next
print("----删除结点----")
ls.remove(1)
cur = ls.head
cur = cur.next
cur1 = cur
print("length:",ls.length())
while cur:
print(cur.val)
cur = cur.next