python 数据结构之链表及常见面试题(找链表的中间节点、是否带环

本文探讨了线性表中顺序表与链表的区别,强调链表在无序数据处理上的优势。重点讲解了链表的结构,包括单链表和循环链表,并提供了两个经典面试题的解决方案:如何找到链表的中间节点以及如何判断链表是否包含环。通过设置快慢指针的方法,分别给出了问题的清晰解答。

线性表和链表的区别?

线性表包括顺序表和链表,
顺序表:优点 基于数组进行遍历和寻址的时候特别快,访问速度快,搜索能力强
缺点:往顺序表插入或删除一个元素,当前位置的后面元素都要向后移动一位

链表:是无序的, 和顺序表是互相补充的

链表组成:节点
单链表:一个个元素,分成2部分,1个数据域,1个指针域指向下一个节点,最后一个节点指向None值
循环链表: 最后一个节点指向 头节点

题目:
1、查找链表的中间节点:
思路:设定快慢指针,快指针一次走2步,慢指针一次走一步,当快指针走到尾部,慢指针所指向的位置就是中间节点:

#如果长度为偶数,则有两个中间结点,则返回第二个中间结点
class Node:    
	def __init__(self,data,next=None):        
	self.data = data        
	self.next = next
	
class Solution:    
	def middleNode(self, head):        
		if head is None:            
			return None        
		slow = fast = head  # 初始化两个指针        
		while fast and fast.next: #while fast.next and fast.next.next则偶数长度,返回第一个中间节点            
			slow = slow.next  # 走一步            
			fast = fast.next.next  # 走两步        
		return slow.data

2、判断链表是否带环:
思路:设定快慢指针,快指针一次走2步,慢指针一次走一步,当快指针=慢指针则带环
循环链表: 最后一个节点指向 头节点

class Node:    
    def __init__(self,data,next=None):        
        self.data = data        
        self.next = next
class Solution:    
    def hasCycle(self, head):        
        if head is None or head.next is None:            
            return Fasle        
        slow = fast = head  # 初始化两个指针        
        loopExist=False        
        while fast and fast.next: 
            slow = slow.next  # 走一步            
            fast = fast.next.next  # 走两步            
            if slow==fast:                
                loopExist=True                
                print("存在环结构")                
                break
                
        if loopExist==True:    #找出节点的位置        
            slow=head            
            while slow!=fast:                
                slow=slow.next                
                fast=fast.next            
            return slow        
        print("不是环结构")        
        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     
    print(Solution().hasCycle(node1).data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值