题解 | #牛群的重新排列#java
牛群的重新排列
https://www.nowcoder.com/practice/5183605e4ef147a5a1639ceedd447838
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param left int整型 * @param right int整型 * @return ListNode类 */ public ListNode reverseBetween (ListNode head, int left, int right) { // write code here if (head == null || left >= right) { return head; } ListNode dummy = new ListNode(-1); dummy.next = head; ListNode prev = dummy; for (int i = 1; i < left; i++) { prev = prev.next; } ListNode current = prev.next; Stack<Integer> stack = new Stack<>(); for (int i = left; i <= right; i++) { stack.push(current.val); current = current.next; } while (!stack.isEmpty()) { prev.next = new ListNode(stack.pop()); prev = prev.next; } prev.next = current; return dummy.next; } }
知识点:
- 链表操作:通过指针遍历、插入、删除节点等操作链表。
- 栈:使用栈来翻转中间子链表部分。
解释提要:这段代码用于反转给定链表中指定范围内的节点。首先创建一个虚拟节点 dummy
,将其指向链表的头部。然后使用两个指针 prev
和 current
来定位需要反转的子链表范围。使用栈来保存这个子链表范围内的节点值,然后将这些节点值依次出栈,并创建新的节点连接到 prev
上,最后完成反转操作。返回处理后的链表。