双链表算法的基本实现

一、双链表的定义

在Python中,我们可以通过定义一个节点类和双链表类来实现双链表。

1. 声明一个节点类

class Node(object):
    def __init__(self, values):
        # 节点值
        self.values = values
        # 前驱指针
        self.prior = None
        # 后驱指针
        self.next = None

2. 声明一个双链表类

class Linken(object):
    def __init__(self):
        # 头结点
        self.head = None
        # 尾结点
        self.tail = None

二、链表的基本操作

1. 判断链表是否为空

def Empty(self):
    return self.head is None

2. 记数链表的长度

def Length(self):
    size = 0
    p = self.head
    while p != None:
        size += 1
        p = p.next
    return size

3. 实现链表的头插法

def InsertHead(self, values):
    newnode = Node(values)
    if self.Empty():
        self.head = newnode
        self.tail = self.head
    else:
        self.head.prior = newnode
        newnode.next = self.head
        self.head = newnode
    return 1

4. 实现链表的尾插法

def InsertTail(self, values):
    newnode = Node(values)
    if self.Empty():
        self.head = newnode
        self.tail = newnode
    else:
        self.tail.next = newnode
        newnode.prior = self.tail
        self.tail = newnode
    return 1

5. 实现链表的中间插法

def Insert(self, index, values):
    if index <= 0:
        self.InsertHead(values)
    elif index > self.Length() - 1:
        self.InsertTail(values)
    else:
        newnode = Node(values)
        p = self.head
        for i in range(index - 1):
            p = p.next
        newnode.prior = p.prior
        newnode.next = p
        p.prior.next = newnode
        p.prior = newnode
    return 1

6. 实现链表的头删法

def DeleteHead(self):
    if self.Empty():
        return None
    elif self.head == self.head.next:
        self.head = None
        self.tail = None
    else:
        self.head = self.head.next
        self.head.prior = None

7. 实现链表的尾删法

def DeleteTail(self):
    if self.Empty():
        return None
    elif self.head == self.tail:
        self.head = None
        self.tail = None
    else:
        self.tail = self.tail.prior
        self.tail.next = None

8. 实现链表的中间删法

def Delete(self, index):
    if index <= 0:
        self.DeleteHead()
    elif index > self.Length() - 1:
        self.DeleteTail()
    else:
        p = self.head
        for i in range(index - 1):
            p = p.next
        p.prior.next = p.next
        p.next.prior = p.prior

9. 实现链表的元素的查询

def SelectLinken(self, values):
    p = self.head
    while p:
        if p.values == values:
            print(p.values, end=' ')
            break
        p = p.next

10. 实现链表的内容输出查询

def OutValues(self):
    p = self.head
    while p:
        print(p.values, end=' ')
        p = p.next
    print()

三、运行实例

1.测试代码

if __name__ == '__main__':
    # 测试以上定义的方法
    print('-------------------头插法-------------------')
    linken = Linken()
    linken.InsertHead(1)
    linken.InsertHead(2)
    linken.InsertHead(3)
    linken.InsertTail(4)
    linken.Insert(2, 5)
    linken.OutValues()
    print('中间删除:')
    linken.Delete(2)
    linken.OutValues()
    print('尾节点删除:')
    linken.DeleteTail()
    linken.OutValues()
    print('头节点删除:')
    linken.DeleteHead()
    linken.OutValues()
    print(linken.SelectLinken(8))
    print('-------------------尾插法-------------------')
    linken = Linken()
    linken.InsertTail(1)
    linken.InsertTail(2)
    linken.InsertTail(3)
    linken.Insert(2, 4)
    linken.OutValues()
    print('中间删除:')
    linken.Delete(2)
    linken.OutValues()
    print('尾节点删除:')
    linken.DeleteTail()
    linken.OutValues()
    print('头节点删除:')
    linken.DeleteHead()
    linken.OutValues()
    print(linken.SelectLinken(8))

2.运行展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云端.代码农夫CloudFarmer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值