题目描述
输入一个链表,反转链表后,输出新链表的表头。
解题思路
设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2的过程中,用pre让节点反转所指方向,next节点保存next1节点防止链表断开
需要注意的点:
1、如果输入的头结点是null,则返回null
2、链表断裂的考虑
迭代:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null)
return null;
ListNode pre = null;
ListNode next = null;
while(head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
递归:
//返回条件 :如果 head 为空或者 head.next 为空,
// 则说明没有节点或者只有一个节点了,返回本节点即可。
//假设 head 节点的 后一个节点 node 节点已经反转好了,只需要改变 node 的下一个节点指向 head 同时 head 的下一个节点指向 null
//head ---> node <--- ... <--- // ListNode node = reverseList(head.next);
//head <--- node <--- ... <--- // head.next.next = head;
//null <--- head <--- node <--- ... <--- // head.next = null; 反转完成
public ListNode reverseList(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseList(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,也就是最后一个节点
return cur;
}
简洁的递归
使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 retret .
此后,每次函数在返回的过程中,让当前结点的下一个结点的 nextnext 指针指向当前节点。
同时让当前结点的 nextnext 指针指向 NULLNULL ,从而实现从链表尾部开始的局部反转
当递归函数全部出栈后,链表反转完成。
作者:huwt
链接:https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-shuang-zhi-zhen-di-gui-yao-mo-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
测试:
package leetcode;
public class demo54 {
public static void main(String[] args) {
ListNode a=new ListNode(1);
a.next=new ListNode(3);
a.next.next=new ListNode(2);
System.out.println(a);
// demo54.reverseList(a);
// System.out.println(a);
// System.out.println(demo54.reverseList(a));
ListNode fff= demo54.reverseList(a);
System.out.println(fff);
}
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
}
public class ListNode {
int val;
ListNode next =null;
ListNode(int x){
val=x;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
}
输出: