首頁 > 軟體

python實現雙向連結串列原理

2022-05-25 14:02:07

雙向連結串列

一種更復雜的連結串列是“雙向連結串列”或“雙面連結串列”。每個節點有兩個連結:一個指向前一個節點,當此節點為第一個節點時,指向空值;而另一個指向下一個節點,當此節點為最後一個節點時,指向空值。

操作

is_empty() 連結串列是否為空
length() 連結串列長度
travel() 遍歷連結串列
add(item) 連結串列頭部新增
append(item) 連結串列尾部新增
insert(pos, item) 指定位置新增
remove(item) 刪除節點
search(item) 查詢節點是否存在

實現

class Node(object):
    """雙向連結串列節點"""
    def __init__(self, item):
        self.item = item
        self.next = None
        self.prev = None


class DLinkList(object):
    """雙向連結串列"""
    def __init__(self):
        self.__head = None

    def is_empty(self):
        """判斷連結串列是否為空"""
        return self.__head == None

    def length(self):
        """返回連結串列的長度"""
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍歷連結串列"""
        cur = self.__head
        while cur != None:
            print cur.item,
            cur = cur.next
        print ""

    def add(self, item):
        """頭部插入元素"""
        node = Node(item)
        if self.is_empty():
            # 如果是空連結串列,將_head指向node
            self.__head = node
        else:
            # 將node的next指向_head的頭節點
            node.next = self.__head
            # 將_head的頭節點的prev指向node
            self.__head.prev = node
            # 將_head 指向node
            self.__head = node

    def append(self, item):
        """尾部插入元素"""
        node = Node(item)
        if self.is_empty():
            # 如果是空連結串列,將_head指向node
            self.__head = node
        else:
            # 移動到連結串列尾部
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            # 將尾節點cur的next指向node
            cur.next = node
            # 將node的prev指向cur
            node.prev = cur

    def search(self, item):
        """查詢元素是否存在"""
        cur = self.__head
        while cur != None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

指定位置插入節點

def insert(self, pos, item):
        """在指定位置新增節點"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self.__head
            count = 0
            # 移動到指定位置的前一個位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            # 將node的prev指向cur
            node.prev = cur
            # 將node的next指向cur的下一個節點
            node.next = cur.next
            # 將cur的下一個節點的prev指向node
            cur.next.prev = node
            # 將cur的next指向node
            cur.next = node

刪除元素

def remove(self, item):
        """刪除元素"""
        cur = self.__head
        while cur != None:
            # 找到了要刪除的元素
            if cur.item == item:
                # 先判斷此結點是否是頭節點
                # 頭節點
                if cur == self.__head:
                    self.__head = cur.next
                    # 如果存在下一個結點,則設定下一個結點
                    if cur.next:
                        # 判斷連結串列是否只有一個結點
                        cur.next.prev = None
                else:
                    cur.prev.next = cur.next
                    # 如果存在下一個結點,則設定下一個結點
                    if cur.next:
                        cur.next.prev = cur.prev
                break
            else:
                cur = cur.next

測試

if __name__ == "__main__":
    ll = DLinkList()
    ll.add(1)
    ll.add(2)
    ll.append(3)
    ll.insert(2, 4)
    ll.insert(4, 5)
    ll.insert(0, 6)
    print "length:",ll.length()
    ll.travel()
    print ll.search(3)
    print ll.search(4)
    ll.remove(1)
    print "length:",ll.length()
    ll.travel()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com