线性表和链表的区别?
线性表包括顺序表和链表,
顺序表:优点 基于数组进行遍历和寻址的时候特别快,访问速度快,搜索能力强
缺点:往顺序表插入或删除一个元素,当前位置的后面元素都要向后移动一位
链表:是无序的, 和顺序表是互相补充的
链表组成:节点
单链表:一个个元素,分成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)