前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 实现双向链表

Python 实现双向链表

作者头像
YingJoy_
发布2018-04-28 17:04:17
1.1K0
发布2018-04-28 17:04:17
举报
#!usr/bin/env python  
#-*- coding:utf-8 -*- 

""" 
@author:yzk13 
@time: 2018/04/18
双向链表
https://blog.csdn.net/qq490691606/article/details/49948263
"""

class Node(object):
    """
    节点类
    """
    def __init__(self, value):
        self.pre = None
        self.value = value
        self.next = None

class DoublyLinkedList(object):
    """
    双向链表类
    """
    def __init__(self):
        """
        初始化链表
        """
        head = Node(None)
        tail = Node(None)
        self.head = head
        self.tail = tail
        self.head.next = self.tail
        self.tail.pre = self.head

    @property
    def length(self):
        """
        获取链表长度
        :return:
        """
        length = 0
        node = self.head
        while node.next != self.tail:
            length += 1
            node = node.next
        return length

    def print(self):
        """
        打印
        :return:
        """
        if self.length == 0:
            print('Nothing')
        else:
            node = self.head.next
            print('[', end='')
            while node.next != self.tail:
                print(node.value, ', ', end='')
                node = node.next
            print('%s]' % node.value)

    def append(self, value):
        """
        表尾添加节点
        :return:
        """
        node = Node(value)
        pre = self.tail.pre
        # 两点之间进行双双链接
        pre.next = node
        node.pre = pre
        node.next = self.tail
        self.tail.pre = node
        return node

    def get(self, index):
        """
        获取节点
        :param index:
        :return:
        """
        if index < 0 or index > self.length:
            print('Index错误,索引越界')
            return None
        else:
            node = self.head.next
            while index:
                node = node.next
                index -= 1
            return node

    def insert(self, index, value):
        """
        插入
        :param index:
        :param value:
        :return:
        """
        if index < 0 or index > self.length:
            print('Index 错误, 索引越界')
        next_node = self.get(index)
        # 开始插入
        node = Node(value)
        pre_node = next_node.pre

        pre_node.next = node
        node.pre = pre_node
        node.next = next_node
        next_node.pre = node
        return node

    def delete(self, index):
        """
        删除节点
        :param index:
        :return:
        """
        node = self.get(index)
        if node:
            node.pre.next = node.next
            node.next.pre = node.pre
            return True
        else:
            return False

    def reverse(self):
        """
        反转链表
        :return:
        1.node.next --> node.pre
          node.pre --> node.next
        2.head.next --> None
          tail.pre --> None
        3.head-->tail
        tail-->head
        """
        pre_head = self.head
        tail = self.tail

        # 调用递归,对每个节点进行交换位置
        def reverse(pre_node, node):
            if node:
                next_node = node.next
                node.next = pre_node
                pre_node.pre = node

                if pre_node is self.head:
                    pre_node.next = None
                if node is self.tail:
                    node.pre = None
                return reverse(node, next_node)

            else:
                self.head = tail
                self.tail = pre_head
        return reverse(self.head, self.head.next)

    def clear(self):
        """
        清空链表
        :return:
        """
        self.head.next = self.tail
        self.tail.pre = self.head







if __name__ == '__main__':
    l = DoublyLinkedList()

    # 测试在表尾添加节点
    l.append(3)
    l.append(4)
    l.append(5)
    l.print()

    # 测试get
    i = 0
    print('第', i, '个元素为: ', l.get(i).value)

    # 测试索引插入
    print('索引插入...')
    l.insert(1, 7)
    l.insert(0, 8)
    l.print()

    # 测试删除节点
    print('删除节点...')
    l.delete(0)
    l.delete(3)
    l.print()

    # 测试反转
    print('反转...')
    l.reverse()
    l.print()

    # 测试清空
    print('清空...')
    l.clear()
    l.print()

    # 测试长度
    print('链表长度为: ', l.length)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档