一、题目内容

image.png

二、题解

解法1:

思路

遍历尾插法。建立 pre 节点、临时存储 curr.next 节点。时间On,空间O1

代码

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. ListNode pre = null;
  4. ListNode curr = head;
  5. while (curr != null) {
  6. ListNode next = curr.next;
  7. curr.next = pre;
  8. pre = curr;
  9. curr = next;
  10. }
  11. return pre;
  12. }
  13. }

解法2:

思路

递归

代码

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. ListNode newHead = reverseList(head.next);
  7. head.next.next = head;
  8. head.next = null;
  9. return newHead;
  10. }
  11. }

解法3:

思路

堆栈

代码

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. Stack<ListNode> stack = new Stack<ListNode>();
  7. //存进去
  8. while (head != null) {
  9. stack.push(head);
  10. head = head.next;
  11. }
  12. //取出来
  13. ListNode curr = stack.pop();
  14. //记录新head
  15. ListNode newHead = curr;
  16. //清空原来存储的不对的next
  17. curr.next = null;
  18. while (!stack.isEmpty()) {
  19. curr.next = stack.pop();
  20. curr = curr.next;
  21. curr.next = null;
  22. }
  23. return newHead;
  24. }
  25. }