206. 反转链表
题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]示例 2:
输入:head = [1,2]
输出:[2,1]示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode ans=new ListNode();
ListNode next=null;
while(head!=null){
next=head.next;
head.next=ans.next;
ans.next=head;
head=next;
}
return ans.next;
}
}
解题思路
头插法
将链表中的每一个结点单独拿出,进行同插入处理
接下来对while里面的代码进行解释
next=head.next; //将链表的下一个结点单独拿出(拿到下一个结点),同时将目标链表的下一个结点的位置存储
head.next=ans.next; //将链表的下一个结点单独拿出(将当前结点与下一个结点隔开)
head.next=ans.next;// 头插入,(将单独的结点与ans链表的第一个结点链接到一起)
ans.next=head;
head=next; //next=head.next;
递归法
我们递归的调用我们定义的函数,直到最后一个结点。这个时候我们有两个指针,分别是是head.next、head.next.next。我们可以将其看成两个结点,我们只要将他们两个结点的指针反转,并且将head.next该成空值即可。自底向上的调用定义的函数。就可以将其反转过来。
代码
/**
* 方法讲的很清楚了,这里就不在赘述
*/
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
//懂的都懂
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
//两个结点的反转
}
}