力扣链表(反转、有无环)

发布于:2024-03-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

LCR 024. 反转链表

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

当我们谈论反转单链表时,我们指的是改变链表中元素的链接方向,使得链表的最后一个节点成为头节点,原本的头节点成为最后一个节点,其余节点也相应地反向链接。

基础概念

  1. 链表(Linked List):链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(在单链表中)。与数组不同,链表中的元素并不需要在内存中连续存储。

  2. 头节点(Head Node):链表中的第一个节点,是链表访问的起点。

  3. 反转链表:就是将链表中的节点链接方向逆转,即每个节点的指针指向前一个节点。

思路

反转单链表的基本思路是遍历链表,将每个节点的指针指向它的前一个节点。为此,我们需要记录三个指针:prevcurrnext

  • prev:指向当前节点curr的前一个节点。
  • curr:当前遍历到的节点。
  • next:当前节点curr的下一个节点。

在遍历过程中,我们逐步将curr的指针指向prev,实现反转。但在此之前,我们需要使用next暂时保存curr的下一个节点,以防止链表断开。

算法步骤

  1. 初始化两个指针prevcurrprev初始化为Nonecurr初始化为头节点head

  2. 遍历链表直到curr为空。在每一步中:

    • 保存curr的下一个节点到next(因为在链接反转后,我们会失去访问它的方式)。
    • curr的指针指向prev,实现反转。
    • 移动prevcurr指针前进一位。
  3. 在链表遍历完成后,prev将会成为新的头节点(因为curr会在遍历到链表末尾时变为None)。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        # 思路:遍历链表,将每个节点的指针指向前一个节点
        # 1.在链表最后面设置一个空节点,作为pre的起点。
        # 2.将链表第一个节点(头节点)作为当前节点cur,当cur非空,则循环进行以下操作
        # 3.创建一个临时变量存储下一个节点cur.next
        # 4.开始将当前节点的指针指向前一个节点pre
        # 5.移动pre到当前节点,移动cur到下一个节点,继续这样的操作

        # 初始化空节点和当前节点
        pre, cur = None, head
        # 循环遍历
        while cur:
            temp = cur.next # 存储下一个节点,因为要改变指针指向了
            cur.next =  pre# 当前指针转向
            pre = cur # 移动前一个节点到当前节点
            cur = temp # 移动当前节点到原来的下一个节点

        return pre


141. 环形链表

链表讲的很好的题解:
https://leetcode.cn/problems/linked-list-cycle/solutions/175734/yi-wen-gao-ding-chang-jian-de-lian-biao-wen-ti-h-2

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        # 初始化快慢指针,快的一次走两步,慢的一次走一步
        slow, fast = head, head
        # 循环,条件是快指针和下一个节点都存在
        while fast and fast.next:
            # 快慢指针移动
            slow = slow.next
            fast = fast.next.next
            # 如果相遇,说明有环
            if slow == fast:
                return True
                
        
        return False
本文含有隐藏内容,请 开通VIP 后查看