双向链表-Python版本

1.双链表

复制代码
#!/usr/bin/env python
# encoding: utf-8
# Author: GuoCheng
# 2022/7/18 18:47

class Node(object):
    def __init__(self, elem):
        """双向链表节点"""
        self.elem = elem
        self.next = None
        self.prev = None


class Linklist(object):
    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        """判断链表是否为空"""
        return self.__head is None

    def travel(self):
        """遍历链表"""
        if self.is_empty():
            return
        cur = self.__head
        while cur is not None:
            print(cur.elem, end=' ')
            cur = cur.next
        print('end...')

    def length(self):
        """链表长度"""
        cur = self.__head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def add(self, elem):
        """链表头部添加元素"""
        node = Node(elem)
        node.next = self.__head
        if self.__head is not None:
            self.__head.prev = node
        self.__head = node

    def append(self, elem):
        """链表尾部添加元素"""
        node = Node(elem)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            cur.next = node
            node.prev = cur

    def insert(self, pos, elem):
        """指定位置添加元素"""
        if pos <= 0:
            self.add(elem)
        elif pos > self.length() - 1:
            self.append(elem)
        else:
            node = Node(elem)
            cur = self.__head
            count = 0
            while count < pos - 1:
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node
            node.prev = cur
            node.next.prev = node

    def remove(self, elem):
        """删除节点"""
        if self.is_empty():
            return
        cur = self.__head
        while cur is not None:
            if cur.elem == elem:
                if cur == self.__head:
                    self.__head = cur.next
                if cur.next is not None:
                    cur.next.prev = cur.prev
                if cur.prev is not None:
                    cur.prev.next = cur.next
                return
            cur = cur.next
            
    def search(self, elem):
        """查找节点"""
        if self.is_empty():
            return
        cur = self.__head
        while cur is not None:
            if cur.elem == elem:
                return True
            cur = cur.next
        return False
    
    def pop(self):
        """删除尾节点"""
        if self.is_empty():
            return
        cur = self.__head
        while cur.next is not None:
            cur = cur.next
        cur.prev.next = None
        return cur.elem
    
    def popleft(self):
        """删除头节点"""
        if self.is_empty():
            return
        cur = self.__head
        self.__head = cur.next
        cur.next.prev = None
        return cur.elem
    
    def index(self, elem):
        """查找节点位置"""
        if self.is_empty():
            return
        cur = self.__head
        count = 0
        while cur is not None:
            if cur.elem == elem:
                return count
            cur = cur.next
            count += 1
        return -1
    
    def count(self, elem):
        """查找节点个数"""
        if self.is_empty():
            return
        cur = self.__head
        count = 0
        while cur is not None:
            if cur.elem == elem:
                count += 1
            cur = cur.next
        return count
    
    def reverse(self):
        """反转链表"""
        if self.is_empty():
            return
        cur = self.__head
        while cur is not None:
            temp = cur.prev
            cur.prev = cur.next
            cur.next = temp
            cur = cur.prev
        self.__head = cur.prev
        
    def sort(self):
        """排序"""
        if self.is_empty():
            return
        cur = self.__head
        while cur is not None:
            cur_next = cur.next
            while cur_next is not None:
                if cur.elem > cur_next.elem:
                    temp = cur.elem
                    cur.elem = cur_next.elem
                    cur_next.elem = temp
                cur_next = cur_next.next
            cur = cur.next
    
    def __str__(self):
        if self.is_empty():
            return ''
        cur = self.__head
        res = ''
        while cur is not None:
            res += str(cur.elem) + ' '
            cur = cur.next
        return res


if __name__ == '__main__':
    node = Node(elem=2)
    ls = Linklist(node)
    ls.add(1)
    ls.travel()
复制代码

 

posted @   G先生  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

:guocheng

点击右上角即可分享
微信分享提示