题目

地址:https://leetcode-cn.com/problems/reverse-linked-list/
难度:简单
描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
实例:
206. 反转链表 - 图1

问题分析

这道算法题,说直白点就是:如何让后一个节点指向前一个节点!在下面的代码中定义了一个 next 节点,该节点主要是保存要反转到头的那个节点,防止链表 “断裂”。

题解

解法-迭代

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode reverseList(ListNode head) {
  13. ListNode pre =null, next;
  14. while (head != null){
  15. //存储下一个节点的指针,否则修改完节点指针就找不到下一个节点了
  16. next = head.next;
  17. //指针修改:把前置节点赋值给当前节点的next
  18. head.next = pre;
  19. //把处理完的节点存到pre节点上
  20. pre = head;
  21. //处理下一个节点
  22. head = next;
  23. }
  24. return pre;
  25. }
  26. }

解法-递归

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