算法题解第五章

14 篇文章 0 订阅
13 篇文章 0 订阅

题目

循环链表

在单链表中 查找是最费劲的,如果我们要找到最后一个元素就得从头到尾一个一个得找,当我们找到最后一个元素,这时候我们还想找前面得节点,又得重新开始,所以我们希望单链表遍历到最后一个节点后下一个节点就是头节点 这样就可以不间断得遍历下去,于是就有了循环链表.

还是老规矩创建节点


class Node:
    def __init__(self,ele):
        self.ele=ele
        self.next=None

#这时候开始创建循环链表即最后一个节点链接到头节点
class CircleList:
    def __init__(self):
        self.head=None
    #尾部插入
    def append_ele(self,ele):
        node =Node(ele)
        #如果头节点是空自己指向自己
        if self.head is None:
            self.head=node
            node.next =self.head
        else:
            cur =self.head
            #找到最后一个节点
            while cur.next !=self.head:
                cur =cur.next
            #新节点指向头节点
            node.next=cur.next
            cur.next =node

    def get_NodeLength(self):
        number = 0
        if self.head is None:
            return number
        cur =self.head
        if cur.next ==self.head:
            return 1

        while cur.next !=self.head:
            number +=1
            cur =cur.next

            #还要加上最后一个元素
        number+=1
        return number

    def delete_ele(self,ele):
        if self.head is None:
            return "没有元素可以删除"
        if self.head.next == self.head:
            self.head=None

        cur =self.head

        ##如果删除的是头节点
        if cur.ele==ele:
            # 找到最后一个节点
            while cur.next != self.head:
                cur = cur.next

            self.head=self.head.next
            cur.next =self.head
            return True
        else:
            pre_node = None
            #找出该节点
            while cur.next != self.head:
                if cur.ele == ele:
                    pre_node.next = cur.next
                    return True
                else:
                    pre_node = cur
                    cur = cur.next
            if cur.ele == ele:
                pre_node.next = cur.next
                return True
            else:
                return False

    #前插入
    def insert_ele(self,pos,ele):
        node=Node(ele)
        if pos ==0:
            return "没有第0个,请输入1"
        pos =pos-1
        #如果是头节点
        if pos ==0:
            cur =self.head
            #找到最后一个节点
            while cur.next != self.head:
                cur=cur.next
            node.next = self.head
            self.head=node
            cur.next=node

        else:
            if 0<pos <= self.get_NodeLength():
                #找到该位置节点
                cur =self.head
                pre_node =None
                for i in range(pos):
                    pre_node = cur
                    cur =cur.next
                print(pre_node)
                print(cur)
                pre_node.next=cur.next
            else:
                return "插入超出范围"



    #按位置删除
    def delete_posele(self,pos):
        #如果是头节点
        pos=pos-1
        if pos==0:
            cur= self.head
            # 找到最后一个节点
            while cur.next != self.head:
                cur=cur.next
            self.head =self.head.next
            cur.next=self.head
            return True
        else:
            if 0<pos <= self.get_NodeLength():
                # 找到该位置节点
                cur = self.head
                pre_node = None
                for i in range(pos):
                    pre_node = cur
                    cur = cur.next
                pre_node.next = cur.next
            else:
                return "删除超出范围"



    def find_ele(self, ele):
        """查找元素是否存在"""
        cur =self.head
        if cur.ele==ele:
            return True
        else:
            while cur.next != self.head:
                if cur.ele == ele:
                    return True
                else:
                    cur =cur.next
            if cur.ele == ele:
                return True
            else:
                return "数据不存在"

    def get_items(self):
        """遍历链表"""
        cur =self.head

        if self.get_NodeLength()==0:
            return
        if self.get_NodeLength()==1:
            yield cur
            return
        while  cur.next !=self.head:
            yield cur
            #指针下移
            cur =cur.next
        else:
            yield cur
            return







#测试
newlist =CircleList()
newlist.append_ele(1)
# print(newlist.get_NodeLength())
# for i in newlist.get_items():
#     print(i.ele)
newlist.append_ele(2)
newlist.append_ele(3)

# print(newlist.find_ele(3))

# print(newlist.delete_ele(2))

print(newlist.delete_posele(2))

for i in newlist.get_items():
    print(i.ele)

# print(newlist.get_NodeLength())

# newlist.delete_posele(1)
# for i in newlist.get_items():
#     print(i.ele)

# newlist.insert_ele(2,5)
# for i in newlist.get_items():
#     print(i.ele)
# newlist.insert_ele(0,5)
# for i in newlist.get_items():
#     print(i.ele)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值