【刷题记录】30.反转链表

123 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

 

示例:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL  

限制:

0 <= 节点个数 <= 5000

 

二、思路分析:

思路一:

  1. 大体思路:迭代
  2. 首先我们迭代需要一个临时的变量来存储后继节点
  3. tempNode = currentNode.next
  4. 然后把cur指向前面节点,最后再继续访问

思路二:

  1. 大体思路:递归
  2. 把后面的节点指向前面的节点
  3. 把cur.next 指向 cur
  4. 结束的条件就是cur为空,说明递归到了最后,然后回溯。

思路三:

  1. 保证每个循环后,head之后的链不断裂。
  2. 将掉下的node连到新链上。

思路四:

  1. 大体思路:双指针法
  2. 设置两个指针,cur 指向链表头节点,pre 指向空
  3. 暂存 cur 的后继节点,tmp = cur.next
  4. 将 cur.next 反指向pre
  5. 将 pre 指向 cur,即 pre 指针后移
  6. 将 cur 指向 2 中暂存的 tmp 节点,即 cur 指针后移 循环 第2 到 5 步,直到 cur 遍历完整个链表

三、AC 代码:

思路一:

    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode currentNode = head;
            ListNode previousNode = null;
            while (currentNode != null) {
                ListNode tempNode = currentNode.next;
                currentNode.next = previousNode;
                previousNode = currentNode;
                currentNode = tempNode;
            }
            return previousNode;
        }
    }

思路二:

    class Solution {
        public ListNode reverseList(ListNode head) {
            return recursion(head, null);
        }

        ListNode recursion(ListNode currentNode, ListNode previousNode) {
            if (currentNode == null) return previousNode;
            ListNode result = recursion(currentNode.next, currentNode);
            currentNode.next = previousNode;
            return result;
        }
    }

思路三:

    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode newHeadNode = null;
            while (head != null) {
                ListNode currentNode = head;
                head = head.next;
                currentNode.next = newHeadNode;
                newHeadNode = currentNode;
            }
            return newHeadNode;
        }
    }

思路四:

    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode currentNode = head;
            ListNode previousNode = null;
            while (currentNode != null) {
                ListNode tempNode = currentNode.next;
                currentNode.next = previousNode;
                previousNode = currentNode;
                currentNode = tempNode;
            }
            return previousNode;
        }
    }