leetcode_206(链表反转)
来源:互联网 发布:秃用一体握把淘宝 编辑:程序博客网 时间:2024/05/01 01:45
一、题目大意
反转一个单链表,实现递归和非递归两种形式
二、链表节点
public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; }}
三,分析
1,非递归解决方案:最容易想到的是使用三个指针,p1,p2,p3,遍历链表事项反转。
(这里需要注意的是,p1,p2,p3的初始化,不同初始化应该考虑链表头的不同处理。一般的初始是p1为空,下面讨论)
2,递归解决方案:每次考虑后面节点已经反转过了
3,插入反转:从第二个开始,把后面的一个节点放在head节点的后面,最后再把第一个节点放在最后。
四、边界处理
if (head == null || head.next == null) { return head; }
五、代码
1,三个指针
public static ListNode reverseList1(ListNode head) { if(head == null || head.next == null) {//边界处理 return head; } ListNode p1 = null;//初始化 ListNode p2 = head; ListNode p3 = head.next; while(p3 != null) {//反转过程 p2.next = p1; p1 = p2; p2 = p3; p3 = p3.next; } p2.next = p1; head = p2; return head; }
2,递归:
public static ListNode reverseList2(ListNode head) { if (head == null || head.next == null) { return head; } ListNode p = head.next; ListNode n = reverseList2(p);//递归 head.next = null; p.next = head; return n; }
3,插入法
public static ListNode reverseList3(ListNode head) { if (head == null || head.next == null) {//边界处理 return head; } ListNode p = head.next; ListNode q = null; while(p.next != null) {//第二个节点开始,后面的节点插入到head的后面 q = p.next;//或得节点 p.next = q.next; q.next = head.next;//插入到head的后面 head.next = q; } p.next = head;//形成环 head = p.next.next;//把第一个节点放在最后 p.next.next = null;//断开环 return head; }
0 0
- leetcode_206(链表反转)
- LeetCode_206. Reverse Linked List-翻转链表
- leetcode_206. Reverse Linked List 反转单链表
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- [Leetcode] 23. Merge k Sorted Lists 解题报告
- JR-02
- activity小总结
- vi常用命令操作
- Java程序员从笨鸟到菜鸟之(六十八)细谈Spring(二)自己动手模拟spring
- leetcode_206(链表反转)
- 浅谈装饰者模式的简单使用和思路
- DBCP连接池
- 二维数组的打印和碰壁条件判断
- Java程序员从笨鸟到菜鸟全部博客目录
- MySQL中char,varchar与text类型的区别和选用
- LeetCode 8. String to Integer (atoi)
- IDEA创建基于maven的java web工程(IDEA版本2016.3)
- sqlsever中查询当前时间至前N天的数据