目录
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
1.使用链表头插的方式,遍历该链表,创建一个新的链表头插该链表的每一个元素,最后返回这个新的链表
3.使用递归,先让head.next以后的链表反转,最后再将heah和head.next反转
给你单链表的头节点 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
1.使用链表头插的方式,遍历该链表,创建一个新的链表头插该链表的每一个元素,最后返回这个新的链表
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode dummyHead = new ListNode();
ListNode x = dummyHead.next;
while(head != null){
x = addFirst(head.val,x);
head = head.next;
}
return x;
}
public static ListNode addFirst(int val,ListNode head){
ListNode x = new ListNode(val);
x.next = head;
return x;
}
}
2.使用双指针遍历数组,一个一个的反转
/**
* 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) {
//判空
if(head == null || head.next == null){
return head;
}
ListNode prev = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
3.使用递归,先让head.next以后的链表反转,最后再将heah和head.next反转
终止条件为链表为空或者链表的下一个节点为空,即返回head
单词递归逻辑:先将当前头节点的下一个节点使用临时变量保存(链表反转后就为最后一个节点),使用新的头节点接受返回后的链表,将当前头节点接在反转链表的最后面(注意避免链表成环)
将链表看成一棵树,其实上面递归的方法就相当于树的后序深度优先遍历
每一层的步骤,就是接收上一层返回头节点,将本层的头节点指向null,将本层头节点接在返回的链表后面,并返回接收到的头节点,就像下面这样
/**
* 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) {
// write code here
if (head == null || head.next == null) {
return head;
}
ListNode newHead = ReverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}