题目:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
思路:
拿到这种反转的题,一个月前刚刚学习数据结构的我,第一思路是通过栈来反转。
栈解题链接:java学习笔记(数据结构和算法2)链表的反转(通过栈实现)源代码带注释,链表的java实现,栈的java实现。_lyl1234564的博客-CSDN博客
但用栈解决,思路虽然简单,时间和空间开销都不尽人意。
下面是本解法的思路:
我们定义一个newHead作为反转后的头结点
我们每一次循环将head的下一个节点移到newHead前面,并让newHead指向新移过来的节点,同时head指向移动节点的下一个节点。(当然我们需要一个temp来记录节点地址)
核心代码:
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode newHead=head;
ListNode temp=null;
while(head.next!=null){
temp=head.next.next;
head.next.next=newHead;
newHead=head.next;
head.next=temp;
}
return newHead;
}
完整代码:
package JianZhiOffer;
public class Day02_2 {
public static void main(String[] args) {
ListNode listNode1=new ListNode(1);
ListNode listNode2=new ListNode(2);
ListNode listNode3=new ListNode(3);
ListNode listNode4=new ListNode(4);
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
ListNode temp=listNode1;
while(temp!=null){
System.out.println(temp);
temp=temp.next;
}
Solution2 solution2=new Solution2();
temp=solution2.reverseList(listNode1);
while(temp!=null){
System.out.println(temp);
temp=temp.next;
}
}
}
class Solution2 {
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode newHead=head;
ListNode temp=null;
while(head.next!=null){
temp=head.next.next;
head.next.next=newHead;
newHead=head.next;
head.next=temp;
}
return newHead;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
@Override
public String toString() {
return "ListNode{" +
"val=" + val+
'}';
}
}
结果: