02 链表

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 个数据元素,建立链表头节点。然后依次获取表中的数据元素。
  2. 每获取一个数据元素,就为该数据元素生成一个新节点,将新节点插入到链表的尾部。
  3. 插入完毕之后返回第 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

            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云枫木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值