涉及到链表的操作,一定要在纸上把过程先画出来,再写程序。
一定要考虑到会不会形成环,并对此进行处理。
自己的解法:
class Solution {
public ListNode reverseList(ListNode head) {
Stack<ListNode> stack = new Stack<>();
//将链表节点依次放入栈中
while (head!=null){
stack.push(head);
head = head.next;
}
//当栈为空,则该链表是空链表
if(stack.isEmpty()) return null;
//为头节点赋值
ListNode ans = stack.pop();
ListNode node = ans;
while (!stack.isEmpty()){
node.next = stack.pop();
node = node.next;
}
//防止出现环
node.next = null;
return ans;
}
}
官方题解:
迭代
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;
}
}
递归
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;
}
}
k神
递归
public ListNode reverseList(ListNode head) {
return recur(head, null); // 调用递归并返回
}
private ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) return pre; // 终止条件
ListNode res = recur(cur.next, cur); // 递归后继节点
cur.next = pre; // 修改节点引用指向
return res; // 返回反转链表的头节点
}