题目:反转链表
详细描述:给定一个单链表的头结点pHead(这个头节点是有值的,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0 ≤ n ≤ 1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
例如:如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

转换过程如下图所示:
示例1
输入:{1,2,3},返回值:{3,2,1}
示例2
输入:{},返回值:{}
解法2:
递归:以相似的方法重复,类似于树结构,先从根节点找到叶子节点,从叶子节点开始遍历大的问题(整个链表反转)拆成性质相同的小问题(两个元素反转)curr.next.next = curr。将所有的小问题解决,大问题即解决。
步骤:
1、只需每个元素都执行以下两个步骤即可:
curr.next.next = curr
curr.next = null
2、为了保证链不断,必须从最后一个元素开始
package od;
/**
* 使用迭代方式解决“链表反转”问题
* 题目:给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
* 原文地址:https://www.codernav.com/2778.html
*/
public class OdTest05 {
static class ListNode {
int val;
OdTest04.ListNode next;
public ListNode(int val, OdTest04.ListNode next) {
this.val = val;
this.next = next;
}
}
public static void main(String[] args) {
// node1 -> node2 -> node3 -> node4 -> node5
OdTest04.ListNode node5 = new OdTest04.ListNode(5, null);
OdTest04.ListNode node4 = new OdTest04.ListNode(4, node5);
OdTest04.ListNode node3 = new OdTest04.ListNode(3, node4);
OdTest04.ListNode node2 = new OdTest04.ListNode(2, node3);
OdTest04.ListNode node1 = new OdTest04.ListNode(1, node2);
OdTest04.ListNode prev = f(node1);
System.out.println(prev);
}
/**
* 递归方式
* @param head
* @return
*/
public static OdTest04.ListNode f(OdTest04.ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 递归的目的是找到最后一个元素,从后往前执行下面的算法,如果从前往后执行,会导致执行一次算法后,链接断开
OdTest04.ListNode newHead = f(head.next);
// 将后一个节点的next节点指向head
head.next.next = head;
// 将后一个节点指向null
head.next = null;
return newHead;
}
}
测试:在方法前后分别打断点,查看ListNode里的值。
反转前:ListNode的顺序是1>2>3>4>5
反转后:ListNode的顺序是5>4>3>2>1
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
