定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
这道题和206. 反转链表
一样。
解法一
List
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
List<Integer> list = new ArrayList<>();
ListNode temp = head;
//保存到list中
while (temp != null) {
list.add(temp.val);
temp = temp.next;
}
//反向放到链表中
temp = head;
for (int i = list.size() - 1; i >= 0; i--) {
temp.val = list.get(i);
temp = temp.next;
}
return head;
}
}
解法二
双指针
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) return null;
//双指针(一前一后)
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
解法三
class Solution {
//新的头节点
private ListNode result = null;
public ListNode reverseList(ListNode head) {
if (head == null) return null;
func(head, head.next);
//让变成最后节点的的next指向null
head.next = null;
return result;
}
private void func (ListNode pre, ListNode cur) {
//出口
if (cur == null) {
//记录新的头节点
result = pre;
return;
}
//递归
func(cur, cur.next);
//后面节点的next指向前面节点
cur.next = pre;
}
}