剑指 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. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。
但行好事 莫问前程