1. 建立虚拟头节点的辅助反转
思路:将每次拆下的一个节点插入到虚拟头节点的下一位置,最终返回
虚拟头节点.next
。
public static ListNode reverseList(ListNode head){
ListNode ans = new ListNode(-1);
ListNode cur = head;
while (cur != null){
ListNode next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
2. 直接操作链表实现反转
思路:分别有
prev
、curr
、next
,将拆下的curr
每次头接到prev
之前,即curr.next = prev
,然后将curr再赋给prev
,将next
赋给curr
,next
前进一位。最终返回prev
。
public ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(cur != null){
ListNode next = curr.next;
curr.next =prev;
prev = curr;
curr = next;
}
return prev;
}
LeetCode206.反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
3. 使用递归来实现链表反转
public ListNode reverseList(ListNode head){
// 当链表为空或长度为1时直接返回head头节点
if(head == null | head.next == null){
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}