算法04-单循环链表


简介:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表


双向链表



节点:

class Node():

""" 节点 """

    def __int__(self,item):

        self.itme = item

        self.next = next



双向链表: 

.class Single_cycle_link_list(object,SingleLinkList):

“”“单向循环链表”“”

    def __init__(self,node=None):

        self.__head = node

        if node:  #如果节点不为空,则节点后继指向链表头,完成循环

            ode.next = self.__head

判空方法:

def is_empty(self):

“”“判断链表是否为空”“”

    :return: self.__head == None

求链表长度:

def length(self):

“”“返回链表长度”“”

    if self.is_empty():

        return True

    else:

        cur = self.__head

        count = 1

        while cur.next != self.__head: #如果游标不等于链表头,一直偏移数数

            count += 1

            cur = cur.next

        return count

打印元素展示

def travel():

“”“打印链表元素”“”

    if self.is_empty():

        return None

    cur = self.__head # 游标

    while cur.next != self.__head:

        print(cur.elem,end='')

        cur = cur.next

    print(cur.elem) #退出循环,游标偏移停止的时候,再打印最后的元素

尾部插入:

def append(self,item):

“”“尾部插入”“”

    node = Node()

    if self.is_empty():

        self.__head = node

        node.next = self.__head

    else:

        cur = self.__head

        while cur.next != self.__head: #游标位置未指向头结点,则继续偏移

            cur = cur.next    

        node.next = self.__head    #退出循环后,游标位置则为最后 

        cur.next = node

头插法:

def add(self,item):

“”“头部插入元素”“”

    node = Node() #实例化节点

    if self.is_empty: #如果是空链表则:空节点next指向头结点    

        self.__head = node

        node.next = self.__head

    else:

        while cur.next != self.__head: #只要指针不是指向首节点

        cur = cur.next #开始偏移

        #当退出循环,游标cur当前指向是尾节点

        node.next = self.__head

位置插入:

def insert(self,pos,item):

""索引位置进行插入""

    if pos <= 0:    

        self.add(item)

    elif pos > (self.length()-1)::

        self.append(item)

    else:

        cur = self.__head

        count = 0

        while count < pos:

            count += 1

            cur = cur.next   #偏移到末尾

        node = Node(item)

        node.next = cur 

        node.perv = cur.perv

        cur.perv.next = cur.perv

        cur.perv = node 

查找元素:

def search(self,item):

“”“查找元素”“”

    if self.is_empty(): #判断链表是否为空

        return False

    cur = self.__head

    while cur.next != self.__head:

        if cur.elem == item:

            return True

        else:

            cur = cur.next 

    #如果单节点,且next是指向首节点,则不进入循环,再加判断

    if cur.elem == item:

        return True

    return False

删除元素

def remove(self,pos,item):

“”“删除元素”“”

    cur = self.__head

    per = None

    while cur.next != self.__head: #如果游标的next不是指向链表头(尾节点),则进入循环偏移

        if cur.elem == item: #如果游标指向的元素恰巧是传入的参数

            if cur == self.__head: #再判断是不是头节点   

                self.__head = cur.next

            else:  #中间节点的情况

                per.next = cur.next

            break

        else:

            #如果不是指向传入的参数,游标per指向游标curs

            per = cur

            cur = cur.next

    #直到退出循环,游标遍历位置是指向尾节点

    if cur.elem == item: #如果是尾节点,是不会进入上面的循环,再加判断

        if cur == self.__head: #如果只有一个节点

            self.__head = None

        else:

            pre.next = cur.next

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 有头链表(注意:头结点有的地方是全局变量) 初学者学自于大话数据结构,不足及错误的地方请读者提出来,谢谢。 可加 ...
    lxr_阅读 4,318评论 0 2
  • 什么是数组? 数组简单来说就是将所有的数据排成一排存放在系统分配的一个内存块上,通过使用特定元素的索引作为数组的下...
    启明_b56f阅读 4,563评论 0 0
  • 核心能力=战略能力+运营能力 战略很重要,指的是战略能力很重要,而不是制定出来的某个战略,甚至需要不断调整战略。短...
    李冉升阅读 3,576评论 0 0
  • 5.10号的婚恋关系课程让尚在围城外的我对婚姻这项神圣的事业有了更透彻的看法。 以前我对婚姻的看法很感性,这堂课让...
    W南茜阅读 4,206评论 1 1
  • 健康要掌握在自己的手里。 我们人的一生,什么是幸福呀!是不是时间自由,财富自由,有句话说得好“睡觉睡到自然醒,...
    七色阳光l阅读 5,908评论 0 4

友情链接更多精彩内容