方法一:递归
思路:
先翻转除去头结点后的链表,再把头结点插到翻转后的链表前面。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode newHead = reverseList(head.next);
ListNode cur = newHead;
while (cur.next != null)
cur = cur.next;
cur.next = head;
head.next = null;
return newHead;
}
}
Runtime:30ms
方法二:头插法
思路:
遍历链表,每次摘取一个节点插到新头结点前面。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode newHead = head, p1 = head.next;
newHead.next = null;
while (p1 != null) {
ListNode p2 = p1.next;
p1.next = newHead;
newHead = p1;
p1 = p2;
}
return newHead;
}
}
Runtime:1ms
方法三:原地翻转
思路:
原地翻转链表,每次翻转两个节点,注意只对头结点进行next置null处理。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode p1 = head;
ListNode p2 = p1.next;
int flag = 0;
while (p2 != null) {
ListNode p3 = p2.next;
if (flag == 0) {
p1.next = null;
flag = 1;
}
p2.next = p1;
head = p2;
p1 = p2;
p2 = p3;
}
return head;
}
}
Runtime:0ms