美文网首页
02_单向循环链表[Python]

02_单向循环链表[Python]

作者: NWPU_HaiboWu | 来源:发表于2019-08-02 09:55 被阅读0次

1. 简介

单链表的一个变形是单向循环链表,链表中最后一个节点的下一个域不再为无,而是指向链表的头节点。


单向循环链表

2. 操作

  • is_empty()判断链表是否为空
  • length()返回链表的长度
  • travel()遍历
  • add(elem)在头部添加一个节点
  • append(elem)在尾部添加一个节点
  • insert(pos,elem)在指定位置pos添加节点
  • remove(elem)删除一个节点
  • search(elem)查找节点是否存在

3. 与单向链表的区别

  • while循环遍历时,终止的条件
    单向:cur !=None
    单向循环:cur.next != self.head
    划重点: 单向循环链表中的这种遍历方式,最后一个节点是没有被算进来的,在travel()、add(elem)、
    append(elem)等方法中都有体现
  • 在进行增删操作时,要多考虑一步,如果节点在末尾时,需要特殊处理

4. 实现

  • 没有区别的部分
class Node(object):
    def __init__(self,elem):
        self.elem=elem
        self.next=None

class SingCycLinkList(object):
    def __init__(self):
        self.head=None

    def is_empty(self):
        return self.head==None
  • 返回链表长度
def length(self):
        """返回链表的长度"""
        # 如果链表为空,返回长度0
        if self.is_empty():
            return 0
        count = 1
        cur = self._head
        while cur.next != self._head:
            count += 1
            cur = cur.next
        return count
  • 遍历链表
    def travel(self):
        """遍历链表"""
        if self.is_empty():
            return
        cur = self._head
        print cur.item,
        while cur.next != self._head:
            cur = cur.next
            print cur.item,
        print ""
  • 三种添加元素
 def add(self,elem):
        node = Node(elem)
        if self.is_empty():
            self.head=node
            node.next=self.head
            # node.next=node
        else:
            node.next=self.head

            #移动到链表的尾部,将尾部的next指针指向node
            cur=self.head
            while cur.next != self.head:
                cur=cur.next
            cur.next=node
            self.head=node

    def append(self,elem):
        node=Node(elem)
        if self.is_empty():
            self.add(elem)
            node.next=self.head
        else:
            #找到末尾节点
            cur=self.head
            while cur.next!= self.head:
                cur=cur.next
            cur.next=node
            node.next=self.head

    def insert(self,pos,elem):
        if pos<=0:
            self.add(elem)
        elif pos > (self.length()-1):
            self.append(elem)
        else:
            node =Node(elem)
            cur = self.head
            count=0
            while count<(pos-1):
                count += 1
                cur=cur.next

            node.next = cur.next
            cur.next=node
  • 删除元素
    def remove(self,elem):
        if self.is_empty():
            return

        cur=self.head
        pre = None
        #如果是头结点
        if cur.elem==elem:
            #如果不止一个节点
            if cur.next!=self.head:
                # 要考虑尾结点
                while cur.next!=self.head:
                    cur=cur.next
                cur.next=self.head.next
                self.head=self.head.next
            else:
                self.head=None
        else:
            pre=self.head
            while cur.next!=self.head:
                if cur.elem==elem:
                    pre.next=cur.next
                    return
                else:
                    pre=cur
                    cur=cur.next
            #如果是尾指针
            if cur.elem==elem:
                pre.next=self.head

  • 搜索元素
    def search(self,elem):
        if self.is_empty():
            return False
        else:
            cur= self.head
            while cur.next!=self.head:
                if cur.elem==elem:
                    return True
                else:
                    cur=cur.next
            #循环结束,尾部的节点没有判断
            if cur.elem==elem:
                return True
            else:
                return False

4. 测试

if __name__=="__main__":
    ll=SingCycLinkList()
    ll.add(2)
    ll.add(1)
    ll.append(4)
    ll.insert(2,3)
    ll.insert(4,5)
    ll.insert(0,0)
    ll.travel()
    print(ll.search(3))
    print("ll is empty: %s" %(ll.is_empty()))
    print("The length of ll is %d" %(ll.length()))
    ll.remove(2)
    ll.travel()
    print("ll is empty: %s" % (ll.is_empty()))
    print("The length of ll is %d" % (ll.length()))

相关文章

  • 02_单向循环链表[Python]

    1. 简介 单链表的一个变形是单向循环链表,链表中最后一个节点的下一个域不再为无,而是指向链表的头节点。 2. 操...

  • 线性表-单向循环链表

    为了方便,本文介绍的单向循环链表不包含头节点 单向循环链表内容 单向循环链表的的定义 单向循环链表的创建 单向循环...

  • python 循环单向链表

    单向循环链表python实现 循环链表实现 头节点添加 尾节点添加 插入 删除 查找

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • 04单向循环链表实现总结

    一、说说什么是单向循环链表? 人狠话不多. 上图. 单向循环链表就是这个样子!单向循环链表.png 与单向链表区别...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 数据结构与算法(第一季):循环链表

    一、单向循环链表 尾节点的next,指向头节点。 二、单向循环链表接口设计 相较于单项链表,单向循环链表需要重写插...

  • 线性表-单向循环链表

    单向循环链表 单向循环链表示意图如下: 数据结构定义(同普通链表) 单向循环链表初始化与赋值 在上面循环遍历查找尾...

网友评论

      本文标题:02_单向循环链表[Python]

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