python實現雙向鏈表

相對於單向鏈表,雙向鏈表多了一個指向前面一個節點的指針,如下圖所示:
這裏寫圖片描述
圖片來源於網絡

利用python實現也非常的容易:

class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None

class LinkList(object):
    def __init__(self):
        self.head = Node('head')


    def add(self, value):
        p = self.head
        new = Node(value)
        while p.next:
            p = p.next      
        p.next = new
        new.prev = p

    def remove(self, value):
        p = self.head
        while p.next:
            if p.value == value:
                temp = p.prev
                xyz = p.next
                temp.next = xyz
                xyz.prev = temp
                break
            else:
                p = p.next

    def find(self, value):
        #根據指定的值找出位置
        p = self.head
        i = 0
        while p.next:
            if p.value == value:
                return i
            else:
                p = p.next
                i += 1

        raise AttributeError(u"can\'t find this element")

    def index(self, index):
        #根據指定的位置找出相應的值
        i = 0
        p = self.head
        while p.next:
            if i == index:
                return p.value
            else:
                i += 1
                p = p.next
        raise IndexError(u'index out of range')

    def findprev(self, value):
        """根據指定節點的值找出前面的一個節點的值"""
        p = self.head       
        while 1:
            if p.value == value:
                return p.prev.value
                break
            else:
                p = p.next
                if not p.next:
                    return p.prev.value
                    break

        raise AttributeError(u"can\'t find this element")

    def findnext(self, value):
        """根據指定節點的值找出後面的一個節點的值"""
        p = self.head       
        while 1:
            if p.value == value:
                return p.next.value
            else:
                p = p.next
                if not p.next:
                    return None
        raise AttributeError(u"can\'t find this element")

    def insert(self, index, value):
        """index必須大於等於1
        """
        i = 0
        p = self.head
        new = Node(value)
        while p.next:
            if i == index:              
                temp = p.prev
                temp.next = new
                new.prev = temp
                new.next = p
                p.prev = new                                
                break
            else:
                p = p.next
                i += 1
        #上面循環自然結束,就直接插入到元素的末尾
        else:
            p.next = new
            new.prev = p

    def length(self):
        p = self.head
        i = 0
        while p.next:       
            p = p.next
            i += 1

        return i

    def output(self):
        p = self.head
        while 1:
            print p.value
            p = p.next
            if not p.next:
                print p.value
                break

    def reverse(self):
        """反轉鏈表"""
        length = self.length()
        i = 0
        p = self.head.next
        while p.next:
            p = p.next
        else:
            last = p
        first = self.head.next
        while i < length:
            first.value, last.value = last.value, first.value
            first = first.next
            last = last.prev
            i += 1
            length -= 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章