Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
二、思路分析:
思路一:
- 大体思路:迭代
- 首先我们迭代需要一个临时的变量来存储后继节点
- tempNode = currentNode.next
- 然后把cur指向前面节点,最后再继续访问
思路二:
- 大体思路:递归
- 把后面的节点指向前面的节点
- 把cur.next 指向 cur
- 结束的条件就是cur为空,说明递归到了最后,然后回溯。
思路三:
- 保证每个循环后,head之后的链不断裂。
- 将掉下的node连到新链上。
思路四:
- 大体思路:双指针法
- 设置两个指针,cur 指向链表头节点,pre 指向空
- 暂存 cur 的后继节点,tmp = cur.next
- 将 cur.next 反指向pre
- 将 pre 指向 cur,即 pre 指针后移
- 将 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;
}
}