美文网首页
python 实现双向链表的基本操作带详细注解

python 实现双向链表的基本操作带详细注解

作者: LittleBear_6c91 | 来源:发表于2019-04-25 19:52 被阅读0次
#双向链表的实现
# coding = utf-8

# 定义节点类
class Node(object):
    def __init__(self,data):
        #定义数据域
        self.data = data
        #定义后指向
        self.next = None
        #定义前指向
        self.prev = None
 #定义双项链表类
class Double_List(object):
    def __init__(self):
        #定义链表头
        self._head = Node(None)
        #定义链表长度
        self._length = 0
    def is_empty(self):
        if self._length == 0:
            return True
        else:
            return False
        #循环遍历节点
    def trave(self):
        #定义游标
        cur = self._head
        for i in range(self._length):
            print(cur.next.data, end=" ")
            cur = cur.next
        else:
            print("")

    #尾部添加节点
    def append(self, data):
        #构造新的节点
        new_code = Node(data)
        #创建游标
        cur = self._head
        for i in range(self._length):
            #移动游标
            cur = cur.next
        else:
            #插入新节点
            #1.新节点有所指向
            new_code.prev = cur
            #2.让与新节点有关的节点有所指向
            cur.next = new_code
            #链表长度加1
            self._length +=1
    def insert(self, pos, data):
        #判断pos有效性
        if isinstance(pos, int):
            if pos < 0 :
                dl.insert(0, data)
            elif pos >self._length:
                dl.append(data)
            else:
                #创建新节点
                new_code = Node(data)
                #创建游标
                cur = self._head
                for i in range(self._length):
                    if i ==pos:
                        #插入新节点:
                        #1,让新的节点有所指向
                        new_code.prev = cur
                        new_code.next = cur.next
                        #2。让与新节点有关的节点有所指向
                        cur.next = new_code
                        new_code.next.prev = new_code

                        #链表长度更新
                        self._length += 1
                        return
                    else:
                        cur = cur.next
        else:
            print('pos数据无效')

    def remove(self, data):
        if self.is_empty():
            print("list is empty!")
        else:
            cur = self._head
            for i in range(self._length):
                if cur.next.data == data:
                    if cur.next.next is None:

                        #尾部节点删除
                        cur.next = None
                    else:
                        #删除中间节点
                        #1.让中间节前的节点的next指向中间节点的后节点
                        cur.next = cur.next.next
                        #2.让中间节点后的节点prev指向中间节点的前节点
                        cur.next.prev = cur
                        #更新链条长度
                        self._length -= 1
                        return
                else:
                    cur = cur.next
            else:
                print("{} is not in".format(data), end="")


if __name__ == "__main__":
    print("尾部插入", end=" ")
    dl = Double_List()
    for i in range(10):
        dl.append(i)
    dl.trave()


    print("任意位置插入:", end=" ")
    dl.insert(-10, "a")
    dl.insert(3,"d")
    dl.insert(10,"c")
    dl.trave()


    print("删除节点:", end=" ")
    dl.remove("d")
    dl.remove("c")
    dl.trave()


相关文章

网友评论

      本文标题:python 实现双向链表的基本操作带详细注解

      本文链接:https://www.haomeiwen.com/subject/oxrtnqtx.html