【Python实现】链表

判断单链表是否有环

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

def find(head):
    low,fast = head,head
    while fast.next!=None and fast.next.next!=None:
        low = low.next
        fast = fast.next.next
        if low==fast:
            return True
            # break
    return False

if __name__ == "__main__":
    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node4 = Node(4)
    node5 = Node(5)
    node1.next = node2
    node2.next = node3
    node3.next = node4
    node4.next = node5
    node5.next = node2
    # node5.next = None  #如果使用这个,就没有环了,return的是False
    print(find(node1))

 

创建链表,并实现链表插入操作(不常用,可跳过)

class Node():
    def __init__(self,item=None):
        self.item = item
        self.next = None
#插入操作
def insert(head,tmp,node):
    tmp.next = node.next
    node.next = tmp
    return head
    
if __name__ == "__main__":
    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node1.next = node2
    node2.next = node3
    node3.next = None
    tmp = Node(8)
    tmp.node = None
    insert(node1,tmp,node2) #将tmp插入node2后面
    print(node2.next.item) # 8
    print(tmp.next) #<__main__.Node object at 0x7f3eafe784e0>
    print(node3) #<__main__.Node object at 0x7f3eafe784e0>

从输出可以看出,node2后面的节点变成了tmp(值为8),tmp后面是node3。
【总结】:但是从上面这个例子可以看出,节点是一个一个定义的,十分麻烦,而且插入节点也是定义好了的,实际上在使用的时候,节点的定义是在函数内部完成的,而且对链表进行插入操作时,只会告诉要插入的值以及插入位置的索引,不会告诉插入节点和被插入节点,因此实际使用中,一般采用下面的方法。

 

python创建有向单链表,并实现基本功能

https://blog.csdn.net/weixin_39881922/article/details/80470896
单链表的基本操作包括:

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

下面是实现:

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

class LinkList():
    def __init__(self,node=None):
        self.head=node

    #初始化链表
    def initlist(self,data):
        self.head = Node(data[0])
        p = self.head
        for i in data[1:]:
            node = Node(i)
            p.next = node
            p = p.next

    # 判断链表是否为空
    def is_empty(self):
        return True if self.head is None else False

    #获取链表长度
    def length(self):
        p = self.head
        count=0
        while(p!=None):
            count+=1
            p = p.next
        return count

    #获取索引index的val
    def getitem(self,index):
        j = 0
        p = self.head
        while(j!=index and p.next!=None):
            p = p.next
            j+=1
        if j==index:
            return p.data

    #遍历整个链表
    def travel(self):
        p = self.head
        res = []
        while(p!=None):
            res.append(p.data)
            p = p.next
        return res

    #链表头部添加元素
    def add(self,item):
        p = self.head
        new_node = Node(item)
        new_node.next = p
        self.head = new_node

    #指定位置添加元素
    def insert(self,item,pos):
        p = self.head
        count = 0
        new_node = Node(item)
        while count<pos-1:
            p = p.next
            count+=1
        new_node.next = p.next
        p.next = new_node

    #删除节点
    def remove(self,item):
        if self.is_empty():
            return
        pre = None #要删除的节点的前一个节点,我们需要改它的next指向
        p = self.head
        while(p!=None):
            if p.data!=item:
                pre = p
                p = p.next
            else:
                if p==self.head: #如果要删除的是头结点
                    self.head = p.next
                    break #删完要break,否则进入死循环
                else:  #删除的不是头节点
                    pre.next = p.next
                    break

    #查找节点是否存在
    def search(self,item):
        p = self.head
        while(p.next!=None):
            if p.data==item:
                return True
            p = p.next
        return False

    #删除链表
    def delete(self):
        p = self.head
        while(p!=None):
            q = p.next  #利用q节点存储p.next,否则p释放后就找不到后半段链表了
            self.remove(p.data)
            p = q #将q赋给p


if __name__ == "__main__":
    l = LinkList()
    l.initlist([1,2,3,4,5])
    # print(l.getitem(1))  #2
    print(l.length()) #5
    print(l.travel()) #[1, 2, 3, 4, 5]
    l.add(10)
    print(l.travel())  #[10, 1, 2, 3, 4, 5]
    l.insert(100,3)
    print(l.travel()) #[10, 1, 2, 100, 3, 4, 5]
    print(l.search(4))  #True
    l.remove(100)
    print(l.travel())  #[10, 1, 2, 3, 4, 5]
    l.delete()
    print(l.travel()) #[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值