题目描述

输入一个链表,反转链表后,输出新链表的表头。

解题思路

递归和遍历两种做法:

  1. 顺序遍历,定义 now,pre,aft 三个指针,分别指向当前节点,前一个节点,下一个节点。遍历的时候反转链表即可。让当前节点从 pre->now->next1->next2 变成 pre<-now next1->next2,pre 节点让链表反向,aft 节点记录 next1 节点,不然链表就断了。
  2. 递归到链表尾部,然后依次反转整个链表。细致一点的图可以看这

image.png

代码实现

  1. import java.util.Scanner;
  2. public class Problem15 {
  3. public class ListNode {
  4. int val;
  5. ListNode next;
  6. ListNode(int val) {
  7. this.val = val;
  8. }
  9. }
  10. public static ListNode ReverseList(ListNode head) {
  11. ListNode now = head;
  12. ListNode pre = null;
  13. ListNode aft = head.next;
  14. while (now != null) {
  15. aft = now.next;
  16. now.next = pre;
  17. pre = now;
  18. now = aft;
  19. }
  20. return pre;
  21. }
  22. public static ListNode ReverseList1(ListNode head) {
  23. if (head == null || head.next == null)
  24. return head;
  25. ListNode reverseHead = ReverseList(head.next);
  26. head.next.next = head;
  27. head.next = null;
  28. return reverseHead;
  29. }
  30. public static void main(String[] args) {
  31. Scanner cin = new Scanner(System.in);
  32. }
  33. }