本文主要是介绍力扣链表(反转、有无环),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LCR 024. 反转链表
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
当我们谈论反转单链表时,我们指的是改变链表中元素的链接方向,使得链表的最后一个节点成为头节点,原本的头节点成为最后一个节点,其余节点也相应地反向链接。
基础概念
链表(Linked List):链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(在单链表中)。与数组不同,链表中的元素并不需要在内存中连续存储。
头节点(Head Node):链表中的第一个节点,是链表访问的起点。
反转链表:就是将链表中的节点链接方向逆转,即每个节点的指针指向前一个节点。
思路
反转单链表的基本思路是遍历链表,将每个节点的指针指向它的前一个节点。为此,我们需要记录三个指针:
prev
、curr
和next
。
prev
:指向当前节点curr
的前一个节点。curr
:当前遍历到的节点。next
:当前节点curr
的下一个节点。在遍历过程中,我们逐步将
curr
的指针指向prev
,实现反转。但在此之前,我们需要使用next
暂时保存curr
的下一个节点,以防止链表断开。算法步骤
初始化两个指针
prev
和curr
。prev
初始化为None
,curr
初始化为头节点head
。遍历链表直到
curr
为空。在每一步中:
- 保存
curr
的下一个节点到next
(因为在链接反转后,我们会失去访问它的方式)。- 将
curr
的指针指向prev
,实现反转。- 移动
prev
和curr
指针前进一位。在链表遍历完成后,
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 = Noneclass Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:# 初始化快慢指针,快的一次走两步,慢的一次走一步slow, fast = head, head# 循环,条件是快指针和下一个节点都存在while fast and fast.next:# 快慢指针移动slow = slow.nextfast = fast.next.next# 如果相遇,说明有环if slow == fast:return Truereturn False
这篇关于力扣链表(反转、有无环)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!