206. 反转链表 (精选)
1.1. 两数之和2.383. 赎金信3.15. 三数之和 14.15. 三数之和 25.18. 四数之和6.344. 反转字符串7.541. 反转字符串 II8.54. 替换数字(第八期模拟笔试)9.151. 反转字符串中的单词 110.55. 右旋字符串(第八期模拟笔试)11.28. 找出字符串中第一个匹配项的下标 112.28. 找出字符串中第一个匹配项的下标 213.459. 重复的子字符串14.kmp算法15.459. 重复的子字符串 (精选)16.27. 移除元素17.344. 反转字符串18.54. 替换数字(卡码网 第八期模拟笔试)19.151. 反转字符串中的单词
20.206. 反转链表 (精选)
21.19. 删除链表的倒数第 N 个结点22.面试题 02.07. 链表相交23.142. 环形链表 II24.15. 三数之和25.18. 四数之和2023-11-18
206. 反转链表 - 力扣(LeetCode)
思路:
注意leetcode是没有头节点的,只有数据节点
1 先将指针放到最后,然后从开头取节点,放到此节点后面 遍历2遍,不好
2 引入头节点,头插法 可以就用本来的链表 / 定义一个新的链表
3 原地反转链表的线
迭代(双指针)
递归 相当于1的思路
1简单,就没有代码了
2:
引入头节点的头插法(用本来链表);
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { //原地反转 双指针 //递归 //栈 //引入头节点 头插法 //引入头节点,头插法 if(head==null || (head!=null && head.next==null)){ return head; } ListNode l=new ListNode(); l.next=head; ListNode now=head; while(now.next!=null){ ListNode temp=now.next; now.next=now.next.next; temp.next=l.next; l.next=temp; } return l.next; } }
定义新链表的头插法:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { //注意leetcode是没有头节点的,只有数据节点 //1 先将指针放到最后,然后从开头取节点,放到此节点后面 遍历2遍,不好 //2 引入头节点,头插法 可以就用本来的链表 / 定义一个新的链表 //3 原地反转链表的线 //迭代 //递归 / 循环 ListNode l=new ListNode(); ListNode now=head; ListNode t; while(now!=null){ t=now.next; now.next=l.next; l.next=now; now=t; } return l.next; } }
3:
递归:
每一层返回的都是最后一个节点,但是在返回的同时将线反转
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { //注意leetcode是没有头节点的,只有数据节点 //1 先将指针放到最后,然后从开头取节点,放到此节点后面 遍历2遍,不好 //2 引入头节点,头插法 可以就用本来的链表 / 定义一个新的链表 //3 原地反转链表的线 //迭代 //递归 / 循环 //原地反转的递归写法 后面是反转完的,前面是待反转的,相当于先将指针指向最后 if(head==null || head.next==null){ return head; } ListNode newHead = reverseList(head.next); head.next.next = head; head.next = null; return newHead; } }
迭代/双指针:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { //原地反转 双指针 //递归 //栈 //引入头节点 头插法 //双指针 if(head==null || (head!=null && head.next==null)){ return head; } ListNode pre=null; ListNode now=head; ListNode temp; while(true){ temp=now.next; now.next=pre; pre=now; if(temp==null){ break; } now=temp; } return now; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY