Skip to main content

2-27 25.K个一组翻转链表

Date:2022-02-27 17:45:52

三个小表情表示题目难度:😄简单 😕中等 😟困难

题目:25.K个一组翻转链表 (😟)

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例

示例1

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明

你的算法只能使用常数的额外空间。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

分析

这个题难度较大,有时间再处理,今天先练习一个简单的题 扩展1:206. 反转链表

LeetCode题解见:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/

题解

TODO

扩展1:206. 反转链表 (😄)

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

img

示例1

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

分析

该题有两种解法,迭代法和递归法

迭代的时候有两个要点,1.向后推进 2.缓存下一个节点(否则会丢失后面的链)

递归可以模拟出栈的效果,所以操作的时候,就直接拿到链表尾巴了,而在本次上下文中又有当前节点信息,所以只需要操作让节点

详细见:https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/

题解

1.迭代法 时间O(n),空间O(1)

function reverseList1(head: ListNode): ListNode {
// [1,2,3,4,5]
let prev: ListNode | undefined
let curr = head

while (curr) {
// cache
const next = curr.next

// move pointer
curr.next = prev
prev = curr
curr = next
}

return prev
}

2.递归法 时间O(n),空间O(n)

function reverseList2(head: ListNode): ListNode {
// [1,2,3,4,5]
if (!head || !head.next) {
// the !head condition only for initial head value is undefined
return head
}

const newHead = reverseList2(head.next)
head.next.next = head
head.next = undefined // only for the tail node
return newHead
}