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

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof

解法一 双指针

分析

定义两个指针: cur 和 pre
每次让 cur 的 next 指向 pre ,实现一次局部反转
局部反转完成之后, pre 和 cur 同时往前移动一个位置
循环上述过程,直至 cur 到达链表尾部

代码

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

方法二 递归

分析

使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 newhead
此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。
同时让当前结点的 next 指针指向 NULL ,从而实现从链表尾部开始的局部反转
当递归函数全部出栈后,链表反转完成。

代码

  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. }