反转链表与拓展【灵神基础精讲】
创始人
2024-02-28 02:17:58

来源0x3f:https://space.bilibili.com/206214

文章目录

  • 反转链表
    • [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)
    • [92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)
    • [25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)
  • 拓展
    • [剑指 Offer 06. 从尾到头打印链表](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)

反转链表

206. 反转链表

难度简单2859

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

示例 1:

img

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

示例 2:

img

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

图片来自:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-shuang-zhi-zhen-di-gui-yao-mo-/

递归

img

class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) return head;//确保有头结点ListNode cur = reverseList(head.next);// 翻转头节点 第二个节点的指向head.next.next = head;// 此时的 head 节点为尾节点,next 需要指向 NULLhead.next = null;return cur;}
}

迭代

class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null; // 前指针结点ListNode cur = head; // 当前指针结点while(cur != null){ListNode tmp = cur.next; //临时结点保存遍历顺序cur.next = pre; //将当前节点指向它前面的节点pre = cur; //前指针后移cur = tmp; //当前指针后移}return pre;}
}

头插法

class Solution {public ListNode reverseList(ListNode head) {ListNode p = head;ListNode res = new ListNode(-1, null);while(p != null){ListNode tmp = p.next;p.next = res.next;res.next = p;p = tmp;}return res.next;}
}

92. 反转链表 II

难度中等1446

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

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

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

性质:反转结束后,从原来的链表上看:

  • pre指向反转这一段的末尾
  • cur指向反转这一段后续的下一个结点
class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dummy = new ListNode(-1);// 初始化哨兵结点,使得处理第一个结点与第i个结点相同dummy.next= head;ListNode p0 = dummy;// 找到要反转的链表左侧的上一个结点for(int i = 0; i < left-1; i++){p0 = p0.next;} ListNode pre = null;ListNode cur = p0.next;for(int i = 0; i < right-left+1; i++){ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}p0.next.next = cur;p0.next = pre;return dummy.next;}   
}

25. K 个一组翻转链表

难度困难1857

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

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

示例 1:

img

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

示例 2:

img

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

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

**进阶:**你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

class Solution {public ListNode reverseKGroup(ListNode head, int k) {//统计一下链表长度int n = 0;ListNode cnt = head;while(cnt != null){n++;cnt = cnt.next;}ListNode dummy = new ListNode(-1);// 初始化哨兵结点,使得处理第一个结点与第i个结点相同dummy.next= head;ListNode p0 = dummy;while(n >= k){ // 循环n/k次n -= k;ListNode pre = null;ListNode cur = p0.next;for(int i = 0; i < k; i++){ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}ListNode nxt = p0.next;p0.next.next = cur;p0.next = pre;p0 = nxt;}return dummy.next;}
}

拓展

剑指 Offer 06. 从尾到头打印链表

难度简单354

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

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

限制:

0 <= 链表长度 <= 10000

从尾到头打印的过程就是递归的过程

class Solution {List tmp = new ArrayList<>();public int[] reversePrint(ListNode head) {recur(head);int[] res = new int[tmp.size()];for(int i = 0; i < res.length; i++){res[i] = tmp.get(i);}return res;}void recur(ListNode head){if(head == null) return;recur(head.next);tmp.add(head.val);}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...