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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值