Leetcode 24.两两交换链表中的节点,19.删除链表的倒数第N个结点,142.环形链表
Leetcode 24
题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
代码实现:
链表结构定义:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
python 代码:
class Solution:
def swapPairs(self, head):
dummpy_head = ListNode(next=head)
current = dummpy_head
while current.next != None and current.next.next != None: # 交换当前节点的后两个元素位置,如果偶数,第一个判断条件;如果是奇数,第二个判断条件;两个条件还不能交换,否则容易导致空指针异常
pre = current.next # 保存当前节点的下一个节点
post = current.next.next.next # 保存当前被交换位置的两个元素的下一个节点
current.next = current.next.next # 指针指向
current.next.next = pre
pre.next = post
current = current.next.next
return dummpy_head.next
复杂度:
时间复杂度:
O
(
n
)
O(n)
O(n),因为要循环遍历整个列表
空间复杂度:
O
(
1
)
O(1)
O(1)
Leetcode 19
题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
代码实现:
链表结构定义:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
python 代码实现:
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
# 问题的关键点在于如何找到倒数第N个节点
dummy_head = ListNode(next=head)
fast = slow = dummy_head
for _ in range(n+1):
fast = fast.next
while fast:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy_head.next
复杂度:
时间复杂度:
O
(
n
)
O(n)
O(n),因为要循环遍历整个列表
空间复杂度:
O
(
1
)
O(1)
O(1)
Leetcode 142
题目:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。
提示:
- 链表中节点的数目范围在范围 [0, 1 0 4 10^4 104] 内
- - 1 0 5 10^5 105 <= Node.val <= 1 0 5 10^5 105
- pos 的值为 -1 或者链表中的一个有效索引
进阶:你是否可以使用 O(1) 空间解决此题?
代码实现:
链表结构定义:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
python 代码:
# 这里为什么不适用虚拟头结点:不涉及删除操作之类的,不用虚拟头结点
fast = head
slow = head
while fast != None and fast.next != None:
fast = fast.next.next
slow = slow.next
if fast == slow:
slow = head
while fast != slow:
fast = fast.next
slow = slow.next
return slow
return None
复杂度:
时间复杂度:
O
(
n
)
O(n)
O(n),因为要循环遍历整个列表
空间复杂度:
O
(
1
)
O(1)
O(1)