题目描述

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

示例

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

解题思路

迭代解法

image.png
反转链表第一感觉,我们应该想到的是,把中间的指针连接,变成相反的,然后移动prev 和 curv就可以了,如下图
image.png
但是,当将指针连接反转时,中间的连接就断了,就没法移动了,出现下图所示的情况
image.png
此时,我们需要一个临时指针变量next,用来保存后一个节点,来帮助移动
image.png

递归解法

image.png

,得到最后一个节点
,通过 head.next.next = head 将最后一个节点的指针指向前一个
head.next = null 将原先后面的节点清空
image.png

代码

迭代解法

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode reverseList(ListNode head) {
  11. ListNode prev = null;
  12. ListNode curv = head;
  13. while(curv != null){
  14. ListNode next = curv.next;
  15. curv.next = prev;
  16. prev = curv;
  17. curv = next;
  18. }
  19. return prev;
  20. }
  21. }

递归解法

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. // 递归
  11. public ListNode reverseList(ListNode head) {
  12. // 终止条件
  13. if(head==null || head.next==null){
  14. return head;
  15. }
  16. //递到尾节点,反转的话,这个节点就是头节点,所以最后返回p
  17. ListNode p = reverseList(head.next);
  18. // 开始归
  19. // head与head.next之间 建立双向链
  20. head.next.next = head;
  21. // 删掉前向链,留下的就是上一步建立的反向链。反转成功
  22. head.next = null;
  23. return p;
  24. }
  25. }