题干:
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。示例:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
public class 反转链表 {
public static void main(String[] args) {
int[] value ={1,2,3,4,5};
ListNode head = new ListNode();
ListNode point = head;
for(int i:value){
ListNode newNode = new ListNode(i);
point.next= newNode;
point = newNode;
}
ListNode test = reverseList(head);
while(test.next!=null){
System.out.println(test.val);
test = test.next;
}
}
public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public static ListNode reverseList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode next = head.next;
ListNode newHead = reverseList(next);
next.next = head;
head.next = null;
return newHead;
}
}
让next节点指向head.next节点,再让其(next节点)作为头节点递归反转链表,以newHead接受反转后的头节点,再让next.next指向原来的头节点,也就是head,最后让原来的头节点head的next指向空,完成反转,返回新的头节点newHead。
ps:ListNode next = head.next; 可以理解为head.next取了一个别名叫next,也可以理解为ListNode指针next指向head.next。
最后一次递归返回前的状态,所以需要设置next.next = head, head.next = null;