单项循环链表基本性质___循环链表基本功能___(search,remove,add,append,travel,insert, and length)

单项循环链表基本性质

leetcode过程中发现很多题都用的到链表,在这里跟大家share一些我学习过程中对链表所知所学,如果有错误,希望大家***善意指正***。在此谢谢大家,如果非商业转发,请注明出处。未经允许,此文不能作为商业用途。

1:循环单链表
首先我们用一个图来表达循环单链表和普通单链表的具体区别。
在这里插入图片描述
在图中可以看出,我们循环单链表和单链表唯一的区别就是,循环链表的尾部是指向循环单链表的头部。即cur.next = self._head

接下来我们介绍一下基本的一些function的作用。每个稍微有难点的代码我都加了解释,希望大家认真学习哈哈哈哈,一起冲冲冲。

  • length的作用:
  def length(self):
            """链表长度"""
            #cur游标,用来移动遍历节点
            if self.is_empty():#判断特殊情况,是不是空节点。
            count = 1
                return 0
            cur = self._head#首先把头节点作为起始节点。
            count = 1#开始遍历
            while cur.next != self._head:#循环的条件是标尺下一个指向不是头节点
                 count += 1
                 cur = cur.next
            return count#计数即可
  • travel的作用:
  def travel(self):#定义travel函数
        """遍历整个链表"""
        if self.is_empty():#首先判断是否为空链
            return
        cur = self._head
        while cur.next !=self._head:
            print(cur.elem,end=" ")#print 每个在循环里面的function的elements
            cur = cur.next
        print(cur.elem,end=" ")#print所有的element
  • add的作用(主要添加头部元素)
  •     def add(self,item):
         """链表头部添加元素"""
         node = Node(item)#确定添加的节点的对象
         if self.is_empty():#对空链表的一系列操作,如果链表是空的,就可以直接把node当作首节点
             self._head = node
             node.next = node
         else:
              cur = self._head
              while cur.next !=self._head:#判断下面一个是否是开头
                 cur = cur.next
              node.next = self._head#1首先让新节点的下一个等于原来的起始节点,让起始节点等于node,之后让尾巴连过来
              self._head = node
              cur.next = node
              #or cur.next = self._head
    
  • append的作用(尾部添加元素)
 def append(self, item):
            """链表尾部添加元素"""
            node = Node(item)
            if self.is_empty():#先判断none的情况
                self._head = node
                node.next = node
            else:
                 cur = self._head
                 while cur.next != self._head:#当两个不想等的时候,可以尾部重新链接。但是是没有断开原来的。
                     cur = cur.next
                 node.next = cur.next#如果cur.next等于self._head,则执行该操作,把尾部连到头部来。
                 cur.next = node
                 #cur.next = node#这种方法更加让人容易理解。
                 #node.next = self._head
  • insert的作用(插入链表中)
  def insert(self, pos, item):
        """删除元素"""
        #param pos 从0开始
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):#不能有等号
            self.append(item)
        else:
             pre = self._head#完全不需要改正
             count = 0
             while count < (pos-1):
                count += 1
                pre = pre.next
        #当循环推出后,pre应该指向pos-1的位置
             node = Node(item)
             node.next = pre.next
             pre.next = node
  • insert的作用
 def insert(self, pos, item):
    """插入元素"""
    #param pos 从0开始
    if pos <= 0:#如果位置小于零,直接调用add函数就好。
        self.add(item)
    elif pos > (self.length()-1):#不能有等号,等号的意味着插入点是倒数第一个和倒数第二个之间。
        self.append(item)
    else:
         pre = self._head#完全不需要改正
         count = 0
         while count < (pos-1):
            count += 1
            pre = pre.next
    #当循环退出后,pre应该指向pos-1的位置
         node = Node(item)
         node.next = pre.next
         pre.next = node
 #这里指的增加元素指的是增加第一个在链表中出现的你指出的"item",但不是增加位置。
``
  • search的作用
        def search(self, item):
            """查找节点是否存在"""
            cur = self._head #检测下空列表的情况,不需要额外写代码
            while cur.next !=self._head
                if cur.elem == item:
                    return True
                else:
                    cur = cur.next
            if cur.elem == item:#判断一下尾节点是不是我们要寻找的,因为前面一个循环是找不到的
                return True
            return False
            
       
  • `remove的作用:
  •     def remove(self, item):
         """删除节点"""
         if self.is_empty():
             return
         cur = self._head #用了两个游标
         pre = None
         while cur.next !=self._head:
             if cur.elem == item:
                if cur.elem == self._head:
                    # 头节点情况
                    # 找尾节点
                    rear = self._head
                    while rear.next != self._head:
                        rear = rear.next
                     self._head = cur.next
                     rear.next = self._head
                else:
                    #中间节点
                    pre.next = cur.next
                return
            else:
                 pre = cur
                 cur = cur.next
             #退出循环,cur指向尾节点
         if cur.elem == item:
             if cur == self._head:
                 """只有一个节点"""
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值