zoukankan      html  css  js  c++  java
  • Python的双向链表实现

    思路

    链表由节点组成,先规定节点(Node),包含data和指向下个节点的next

    1. 初始化

      data当然就是传入的data了,next和prev指向None

    2. 添加

      分两种情况:

      1. 链表为空,那么头节点和尾节点都指向新插入的节点
      2. 链表不为空,那么直接在尾部添加即可
    3. 遍历

      因为只有链表的尾节点的next是指向None的,所以可以根据这点来从头遍历

    4. 删除某个节点

      删除的时候分4种情况:

      1. 链表为空的时候
      2. 头节点,此时更改头节点的prev
      3. 尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可
      4. 中间的节点,修改要删除的节点的前驱和后继节点的next和prev指向就好
    5. 搜寻

      遍历查找即可

    6. 清空链表

      将头节点和尾节点都置为None即可

    class Node:
        def __init__(self,data=None, next=None, prev=None):
            self.next = next
            self.prev = prev
            self.data = data
    
    class DoublyLinkedList:
        def __init__(self):
            self.head = None
            self.tail = None
            self.size = 0
    
        def append(self,data):
            '''添加元素'''
            node = Node(data,None,None)
            if self.head is None:
                self.head = node
                self.tail = self.head
            else:
                node.prev = self.tail
                self.tail.next = node
                self.tail = node   
            self.size += 1
    
        def iter(self):
            '''遍历链表'''
            current = self.head
            while current:
                value = current.data
                current = current.next
                yield value
    
        def delete(self,data):
            '''根据数据删除节点'''
            current = self.head
            node_deleted = False
            if current is None:			#链表为空
                node_deleted = False
            elif current.data == data:		#要删除的元素在链表的开头
                self.head.prev = None
                self.head = current.next
                node_deleted = True
            elif self.tail.data == data:		#要删除的元素在链表的结尾
                self.tail = self.tail.prev
                self.tail.next = None
                node_deleted = True
            else:		#要删除的元素在链表中间的某一处
                while current:
                    if current.data == data:
                        current.prev.next = current.next
                        current.next.prev = current.prev
                        node_deleted = True
                    current = current.next
            if node_deleted:	#如果有元素被删除,长度就减一
                self.size -= 1
    
        def contain(self,data):
            '''搜寻某个节点'''
            for node in self.iter():
                if data == node:
                    return True
            return False
    
        def clear(self):
            '''清空链表'''
            self.tail = None
            self.head = None
    
  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9630186.html
Copyright © 2011-2022 走看看