题目说明
反转一个单链表。
示例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL进阶
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Java代码
- 迭代解法
- 单链表只有一个next指针,当修改next指针之后,就会丢失原来所指向的结点;
- 所以需要一个新的指针用于标记原来被next指针指向的结点;
- 所以在使用迭代来解这道题时,我们需要三个指针,一个指向当前结点,一个指向当前结点的下一个节点,还有一个指向当前节点在反转链表后next指针应该指向的节点;
- 其中当前结点和当前节点在反转链表后next指针应该指向的节点应该先进行标记;
- 在替换当前结点的next指针指向的节点前标记当前结点的下一个节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
// 标记当前结点next指针将要指向的结点
ListNode prev = null;
// 标记当前结点
ListNode curr = head;
while (curr != null) {
// 标记当前结点next指针指向的结点
ListNode nextTemp = curr.next;
// 替换当前结点next指针指向的结点
curr.next = prev;
// 替换为下一结点next指针将要指向的结点
prev = curr;
// 替换为当前结点的下一结点
curr = nextTemp;
}
return prev;
}
}
- 递归解法
- 递归解法是从链表尾端开始反转的,递归调用的方法的返回值应该是反转后单链表的头节点。
- 反转的操作是先让当前节点的下一个节点的next指针指向当前节点,然后让当前节点的next指针指空,最后方法返回。
class Solution {
public ListNode reverseList(ListNode head) {
//1、如果头节点为空或头节点的下一个结点为空,直接返回头节点,不用排序
//2、如果当前节点的下一个结点为空,说明已经到了该单链表尾端,返回当前节点以待下一步处理
if (head==null||head.next==null) return head;
//遍历节点至当前节点的next指针指向null,并用p暂存该节点作为返回值
ListNode p = reverseList(head.next);
//令当前节点的下一个节点的next指针指向当前节点
head.next.next = head;
//断开当前节点的next指针,使其没有后续节点
head.next = null;
return p;
}
}