数据结构与算法(python版)(五)——单向循环链表

数据结构与算法(python版)(五)

1、单向循环链表

链表的最后一个节点的next域不再为None,而是指向链表的头节点
在这里插入图片描述

2、单向循环链表的操作

① is_empty()     链表是否为空
② length()       链表长度
③ travel()        遍历链表
④ add(item)        头部添加元素
⑤ append(item)    尾部添加元素
⑥ insert(pos, item)  指定位置添加元素
⑦ remove(item)    删除节点
⑧ search(item)     查找节点是否存在

3、单向循环链表代码实现

class Node(object):
    #节点
    def __init__(self, elem):
        self.elem = elem
        self.next = None
        
class SingleLinkList(object):
    #单向循环链表
    def __init__(self, node = None):
        self.__head = node
        #传入单个节点,要设置自身循环
        if node:
            node.next = node
        
    def is_empty(self):
        #链表是否为空
        return self.__head == None
    
    def length(self):
        #链表长度
        if self.is_empty():
            return 0
        cur = self.__head #设置游标
        count = 1   #因为cur.next != self.__head, 所以count必须从1开始
        while cur.next != self.__head:
            count += 1
            cur = cur.next
        return count
    
    def travel(self):
        #遍历链表
        if self.is_empty():
            return
        cur = self.__head   #如果是空链表,后续代码无法执行,故先用if过滤
        while cur.next != self.__head:
            print(cur.elem, end = ' ')
            cur = cur.next
            #cur指向最后一个节点,不再进入循环,故最后一个节点不能打印
        print(cur.elem)
        print(' ')
    
    def append(self, item):
        #尾插法
        node = Node(item)
        if self.is_empty():  #判空
            self.__head = node
            node.next = node
        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(item)
        if self.is_empty():  
            self.__head = node
            node.next = node
        else:
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            #退出循环,cur指向尾结点
            node.next = self.__head
            self.__head = node
            cur.next = node
            
            
            
    def insert(self, pos, item):
        #指定位置插入元素
        #游标移动到(pos-1)位置
        node = Node(item)
        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
            node.next = pre.next
            pre.next = node
        
    
    def remove(self, item):
        #删除节点
        #设置一前一后两个游标
        if self.is_empty():
            return
        cur = self.__head
        pre = None
        #开始遍历  
         
        while cur.next != self.__head:
            #cur没到尾结点
            if cur.elem == item: #cur的元素与要删除元素一致
                #判断是否为头节点
                if cur == self.__head:
                    #要删除的元素是头节点时
                    rear = self.__head
                    while rear.next != self.__head:
                        rear = rear.next
                    #退出循环,找到尾结点
                    #操作self.__head和rear指向
                    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:
                self.__head = None
            else:
                pre.next = cur.next
             
    
    def search(self, item):
        #查找节点是否存在
        cur = self__head
        if self.is__empty():
            return False
        cur = self.__head
        while cur.next != self.__head:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
            #退出循环,cur指向尾结点但是没有比较
        if cur.elem == item:
            return True
        return False
        
        
if __name__ == '__main__':
    ll = SingleLinkList()
    print(ll.is_empty())
    
    ll.append(1)
    ll.append(2)
    ll.append(3)
    ll.append(4)
     
    ll.add(8)
    ll.insert(2, 5)
    ll.insert(-1, 55)
    ll.insert(10, 65)


    ll.travel()
    ll.remove(4)
    ll.travel()
    ll.remove(55)
    ll.travel()
    ll.remove(65)
    ll.travel()
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值