首页 > 编程语言 > 详细

python实现双链表

时间:2020-07-30 18:16:52      阅读:85      评论:0      收藏:0      [点我收藏+]

介绍

技术分享图片

 

 

双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search。这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可。

不同之处一是在于节点实现的不同。因为增加了指向前一个节点的前驱区,因此需要为节点添加一个新属性prev,用以指向前一个节点。

另外一点就是在做增删的操作时,需要额外考虑节点的前驱区的指向。其中的remove方法更是需要考虑多种特殊情况。

下面给出代码前,先放一个自己做的图示。(右键选择在新页面打开可看完整图示)

技术分享图片

代码实现

# 双链表
class Node(object):
    # 初始化双向链表节点
    def __init__(self,item):
        self.item=item
        self.next=None
        self.pre=None
class DoubleLinkList(object):
    # 1、初始化双链表
    def __init__(self):
        self._head=None
    # 2、判断双链表是否为空
    def is_empty(self):
        return self._head == None
    # 3、获取双链表的长度
    def get_length(self):
        cur=self._head
        count =0
        while cur !=None:
            # 返回链表的长度
            count=count+1
            cur=cur.next
        return count
    # 4、遍历双链表
    def travel(self):
        cur =self._head
        while cur !=None:
            print(cur.item)
            cur=cur.next
        print("")
    # 5、头部添加元素
    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.pre=node
            # 将_head 指向node
            self._head=node
    #6、尾部添加元素
    def append(self, value):
        node = Node(value)
        cur = self._head
        if self.is_empty():
            self._head = Node
            return
        while cur.next:
            cur = cur.next
        cur.next = node
        node.prev = cur
    # 7、指定位置添加元素
    def insert(self, pos, value):
        if pos <= 0:
            self.add(value)
        elif pos > self.get_length() - 1:
            self.append(value)
        else:
            # 单向链表中为了在特定位置插入,要先在链表中找到待插入位置和其前一个位置
            # 双向链表中就不需要两个游标了(当然单向链表中一个游标也是可以只找前一个位置)
            node = Node(value)
            count = 0
            cur = self._head
            while count < pos - 1:
                count += 1
                cur = cur.next
            # 此时的游标指向pos的前一个位置
            # 这里的相互指向需尤为注意,有多种实现,需细细分析
            node.next = cur.next
            cur.next.prev = node
            node.prev = cur
            cur.next = node
    #8、搜索指定元素
    def search(self, item):
        cur = self._head
        while cur:
            if cur.item == item:
                return True
            else:
                cur = cur.next
        return False
    # 9、删除指定的元素
    def remove(self, item):
        if self.is_empty():
            return
        cur = self._head
        while cur:
            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
                return
            else:
                cur = cur.next
# 测试
if __name__ == "__main__":
    lst = DoubleLinkList()
    print(lst.is_empty())
    print(lst.get_length())
    lst.add(1)
    lst.add(2)
    lst.travel()
    lst.append(3)
    lst.travel()
    lst.insert(2,100)
    lst.travel()
    lst.search(100)
    lst.remove(100)
    lst.travel()

运行结果

C:\Anaconda3\python.exe "C:\Program Files\JetBrains\PyCharm 2019.1.1\helpers\pydev\pydevconsole.py" --mode=client --port=59682
import sys; print(Python %s on %s % (sys.version, sys.platform))
sys.path.extend([C:\\app\\PycharmProjects, C:/app/PycharmProjects])
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type copyright, credits or license for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type ? for help.
PyDev console: using IPython 7.12.0
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] on win32
runfile(C:/app/PycharmProjects/DataStructure/LinkedList/double_linked_list.py, wdir=C:/app/PycharmProjects/DataStructure/LinkedList)
True
0
2
1
2
1
3
2
1
100
3
2
1
3

 

python实现双链表

原文:https://www.cnblogs.com/huanghanyu/p/13404901.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!