题目
https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/submissions/
思路
方法1、开辟一个o(n)数组,把链表的节点都放进去,然后逆序输出新的链表
方法2、使用中间变量 就像交换俩个数一样
方法3、使用递归实现。(难懂哦)
/*
方法一 使用中间变量 类似交换俩个变量的值一样
时间复杂度是o(n)
空间复杂度是o(1)
*/
public ListNode reverseList(ListNode head) {
if(head==null){
return head;
}
ListNode pre =null;
ListNode cur = head;
while (cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
/**
*
* @param head
* @return 递归
*/
public ListNode reverseListByRec(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseListByRec(head.next);
//如果链表是 1->2->3->4->5,那么此时的cur就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回cur,也就是最后一个节点 cur表示翻转后的第一个节点。
return cur;
}
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
ListNode listNode1 = new ListNode(2);
ListNode listNode2 = new ListNode(3);
ListNode listNode3 = new ListNode(4);
listNode.next = listNode1;
listNode1.next =listNode2;
listNode2.next =listNode3;
ReverseListNode t = new ReverseListNode();
ListNode sd = t.reverseListByRec(listNode);
System.out.println(1);
}
参考
慕课网波波的数据结构和算法