链表结构

定期整理点滴,完善自己,要给洋哥挣钱,让她不受苦,加油吧

这里写图片描述

class LList:
    def __init__(self):
        self._head = None

    def is_empty(self):
        return self._head is None

    def prepend(self, elem):
        self._head = LNode(elem, self._head)

    def pre_pop(self):
        if not self._head:
            raise LinkedListUnderflow("in pre pop")
        e = self._head.elem
        self._head = self._head.next
        return e

    def append(self, elem):
        if not self._head:
            self._head = LNode(elem)
            return
        p = self._head
        while p:
            p = p.next
        p.next = LNode(elem)

    def pop(self):
        if not self._head:
            raise LinkedListUnderflow("in pop")
        p = self._head
        if not p.next:
            e = p.elem
            self._head = None
            return e
        while p.next.next:
            p = p.next
        e = p.next.elem
        p.next = None
        return e

    def length(self):
        if not self._head:
            return 0
        p = self._head
        count = 1
        while p.next:
            count += 1
            p = p.next
        return count

    def reverse(self):
        p = None
        while self._head:
            q = self._head
            self._head = q.next
            q.next = p
            p = q
        self._head = p

    def print_all(self):
        if not self._head:
            return
        p = self._head
        while p:
            print(p.elem, end='')
            if p.next:
                print(', ', end='')
            p = p.next
        print('')

    def get_node(self, item):
        if not self._head:
            return
        if item > self.length() - 1:
            return -1
        p = self._head
        while item:
            p = p.next
            item -= 1
        return p

    def elements(self):
        p = self._head
        while p:
            yield p.elem
            p = p.next

    def filter(self, func):
        p = self._head
        while p:
            if func(p.elem):
                yield p.elem
            p = p.next


class WLList(LList):
    def __init__(self):
        super(WLList, self).__init__()
        self._rear = None

    def prepend(self, elem):
        if not self._head:
            self._head = LNode(elem)
            self._rear = self._head
        else:
            self._head = LNode(elem, self._head)

    def append(self, elem):
        if not self._head:
            self._head = LNode(elem)
            self._rear = self._head
        else:
            self._rear.next = LNode(elem)
            self._rear = self._rear.nex

    def pop(self):
        if not self._head:
            raise LinkedListUnderflow("in pop")
        p = self._head
        while not p.next:
            e = p.elem
            self._head = None
            return e
        while p.next.next:
            p = p.next
        e = p.next.elem
        p.next = None
        self._rear = p
        return e

    def reverse(self):
        r = self._head
        super().reverse()
        self._rear = r
        # self._rear = self.get_node(self.length() - 1)


class LCList:
    def __init__(self):
        self._rear = None

    def is_empty(self):
        return self._rear is None

    def prepend(self, elem):
        p = LNode(elem)
        if not self._rear:
            p.next = p
            self._rear = p
        else:
            p.next = self._rear.next
            self._rear.next = p

    def append(self, elem):
        self.prepend(elem)
        self._rear = self._rear.next

    def pre_pop(self):
        if not self._rear:
            raise LinkedListUnderflow("in pre pop")
        p = self._rear.next
        if self._rear is p:
            self._rear = None
        else:
            self._rear.next = p.next
        return p.elem

    def pop(self):
        if not self._rear:
            raise LinkedListUnderflow("in pop")
        p = self._rear.next
        e = self._rear.elem
        if self._rear is p:
            self._rear = None
        else:
            while p.next is not self._rear:
                p = p.next
            p.next = self._rear.next
            self._rear = p
        return e

    def length(self):
        if not self._rear:
            return 0
        p = self._rear.next
        count = 1
        while p is not self._rear:
            count += 1
            p = p.next
        return count

    def reverse(self):
        if not self._rear:
            return
        p = self._rear
        q = p.next
        rear = q
        while q is not self._rear:
            r = q.next
            q.next = p
            p = q
            q = r
        q.next = p
        self._rear = rear

    def get_node(self, item):
        if not self._rear:
            return
        if item > self.length() - 1:
            return
        p = self._rear.next
        while item:
            p = p.next
            item -= 1
        return p

    def print_all(self):
        if not self._rear:
            return
        p = self._rear.next
        while p is not self._rear:
            print(p.elem, end=', ')
            p = p.next
        print(p.elem)

    def elements(self):
        p = self._rear.next
        while p is not self._rear:
            yield p.elem
            p = p.next
        yield p.elem

    def filter(self, func):
        p = self._rear.next
        while p is not self._rear:
            if func(p.elem):
                yield p.elem
            p = p.next
        if func(p.elem):
            yield p.elem


class DLList(WLList):
    def __init__(self):
        super(DLList, self).__init__()

    def prepend(self, elem):
        p = DLNode(elem, None, self._head)
        if not self._head:
            self._rear = p
        else:
            p.next.prev = p
        self._head = p

    def append(self, elem):
        p = DLNode(elem, self._rear)
        if not self._head:
            self._head = p
        else:
            p.prev.next = p
        self._rear = p

    def pre_pop(self):
        if not self._head:
            raise LinkedListUnderflow("in pre pop")
        e = self._head.elem
        self._head = self._head.next
        if self._head:
            self._head.prev = None
        return e

    def pop(self):
        if not self._head:
            raise LinkedListUnderflow("in pop")
        e = self._rear.elem
        self._rear = self._rear.prev
        if not self._rear:
            self._head = None
        else:
            self._rear.next = None
        return e

    def reverse(self):
        p = None
        r = self._head
        while self._head:
            q = self._head
            self._head = q.next
            q.prev = q.next
            q.next = p
            p = q
        self._head = p
        self._rear = r


class DCList(LCList):
    def __init__(self):
        super(DCList, self).__init__()

    def prepend(self, elem):
        p = DLNode(elem)
        if not self._rear:
            p.next = p
            p.prev = p
            self._rear = p
        else:
            p.next = self._rear.next
            p.prev = self._rear
            self._rear.next.prev = p
            self._rear.next = p

    def append(self, elem):
        self.prepend(elem)
        self._rear = self._rear.next
    
    def pre_pop(self):
        if not self._rear:
            raise LinkedListUnderflow("in pre pop")
        p = self._rear.next
        if self._rear is p:
            self._rear = None
        else:
            self._rear.next = p.next
            p.next.prev = self._rear
        return p.elem

    def pop(self):
        if not self._rear:
            raise LinkedListUnderflow("in pop")
        p = self._rear.next
        e = self._rear.elem
        if self._rear is p:
            self._rear = None
        else:
            while p.next is not self._rear:
                p = p.next
            p.next = self._rear.next
            self._rear.next.prev = p
            self._rear = p
        return e

    def reverse(self):
        if not self._rear:
            return
        p = self._rear
        q = p.next
        rear = q
        while q is not self._rear:
            r = q.next
            q.prev = r
            q.next = p
            p = q
            q = r
        q.next = p
        q.prev = rear
        self._rear = rear

class LinkedListUnderflow(ValueError):
    pass

class LNode:
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_

class DLNode(LNode):
    def __init__(self, elem, prev=None, next_=None):
        super(DLNode, self).__init__(elem, next_)
        self.prev = prev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值