剑指 Offer 24. 反转链表

1. 题目

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

2. 示例

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

限制:

0 <= 节点个数 <= 5000

3.  题解

本题给了两种解题方式:栈和迭代

    • 因为本题是要倒序。所以第一想法都是栈,栈的思想是先进后出。
    • 第一遍依次遍历链表,将节点放入栈。
    • 第二遍遍历栈,依次将栈顶元素加入链表
  • 迭代
    • 在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

4. 实现

4.1 栈

 1 //
 2     public ListNode reverseListA(ListNode head) {
 3         // 定义栈,将链表的依次压如栈底
 4         Stack<ListNode> stack = new Stack<>();
 5         if(head == null) return null;
 6         while (head != null) {
 7             stack.push(head);
 8             head = head.next;
 9         }
10         // 获取栈顶元素,并将其作为头结点
11         ListNode cur = stack.pop();
12         // 指向头头结点
13         ListNode p = cur;
14         // 依次出栈
15         while (!stack.empty()) {
16             // 依次加入链表
17             cur.next = stack.pop();
18             cur = cur.next;
19         }
20         // 最后一个元素为空
21         cur.next = null;
22         return p;
23     }

4.2 迭代

 1 // 迭代
 2     public ListNode reverseListB(ListNode head) {
 3         ListNode prev = null, cur = head;
 4         while (cur != null) {
 5             // 获取下一个节点
 6             ListNode next = cur.next;
 7             // 当前节点的下一节点指向prev
 8             cur.next = prev;
 9             // 再反过来赋值,就达到了prev到达头结点
10             prev = cur;
11             // 遍历下一个节点
12             cur = next;
13         }
14         return prev;
15     }

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

posted @ 2021-07-11 20:59  抚琴尘世客  阅读(44)  评论(0编辑  收藏  举报