题目描述:
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
示例1
输入:
{1,2,3}
复制
返回值:
{3,2,1}
分析
1、Java的单链表怎么创建
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
2、添加数据并链接
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
//设计链表链接方式1-->2-->3
l1.next=l2;
l2.next=l3;
l3.next=null;
3、反转核心代码逻辑
public ListNode ReverseList(ListNode head) {
//处理空链表
if(head == null)
return null;
ListNode cur = head;
ListNode pre = null;
while(cur != null){
ListNode temp = cur.next;//目的:跳出循环
cur.next = pre;//目的:替换next的数据
pre = cur;//目的:链接新表
cur = temp;
}
return pre;
}
}
分析
第一轮cur=1,2,3 pre=null,所以cur.next都被null替换,此时cur就只保留了第一个数据即cur=1 赋值给pre=1
第二轮cur被temp赋值为cur=2 pre=1,所以cur.next=1,那么pre=2,1
第三轮cur被temp赋值为cur=3 pre=2,1 所以cur.next=2,1,那么pre=3,2,1
完整代码及推导
/**
* Created by KingsLanding on 2022/9/12 11:34
*/
public class demo01 {
public ListNode ReverseList(ListNode head) {
//处理空链表
if(head == null)
return null;
ListNode cur = head;
ListNode pre = null;
while(cur != null){
//将链表断开,让链表逐次变短后移,直到最后为null,跳出循环
/*
此时的temp=cur.next“这个”数据,比如第一轮temp=2,
第二轮temp=3,第三轮temp=null跳出循环
*/
ListNode temp = cur.next;//目的:跳出循环
//当前的next指向前一个;意味着cur之后的即cur.next链接的数据被此时的pre替换
/*
第一轮cur=1,2,3 pre=null,所以cur.next都被null替换此时cur就只保留了第一个数据即cur=1 赋值给pre=1、
第二轮cur被temp赋值为cur=2 pre=1,所以cur.next=1,那么pre=2,1
第三轮cur被temp赋值为cur=3 pre=2,1 所以cur.next=2,1,那么pre=3,2,1
*/
cur.next = pre;//目的:替换next的数据
//前一个更新为当前
pre = cur;//目的:链接的新表
//当前更新为刚刚记录的后一个
//因为cur.next = pre;所以需要在此将cur的值还原
cur = temp;
}
return pre;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
public static void main(String[] args) {
demo01 demo01 = new demo01();
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
//设计链表链接方式1-->2-->3
l1.next=l2;
l2.next=l3;
l3.next=null;
//返回的链表3-->2-->1
ListNode listNode1 = demo01.ReverseList(l1);
while (listNode1!=null){
System.out.println(listNode1.val+"");
listNode1=listNode1.next;
}
}
}