(四)剑指Offer 24.反转链表
1.题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2.方法一:迭代(双指针)
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, pre = null;//cur当前节点,
//pre上一个节点
while(cur != null){
ListNode tmp = cur.next;//暂存后继节点cur.next
cur.next = pre; //修改next引用指向,(实现逆转)
pre = cur; //pre暂存cur
cur = tmp; //cur访问下一节点
}
return pre;
}
}
3.方法二
算法思想:
考虑使用递归法遍历链表,当越过尾节点后终止递归,在回溯时修改各节点的 next 引用指向。
算法设计:
recur(cur,pre)递归函数:
终止条件:当cur为空,则返回尾节点pre(即反转链表的头节点);
递归后继节点,记录返回值(即反转链表的头节点)为res;
修改当前节点cur引用指向前驱节点pre;
返回反转链表的头节点res;
reverseList(head)函数:
调用并返回recur(head,null)。传入 null 是因为反转链表后,head节点指向null;
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
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; //返回反转链表的头节点
}
}
[源于剑指offer]( 剑指 Offer 24. 反转链表(迭代 / 递归,清晰图解) - 反转链表 - 力扣(LeetCode))