LeetCode92. 反转链表 II
题目描述
/**
*
* 给你单链表的头指针 head 和两个整数 left 和 right ,
* 其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,
* 返回 反转后的链表 。
*
*/
思路分析
- 将一个链表中指定位置的元素反转,其他位置的元素保持不变
- 使用变量cur记录当前遍历到的是原始链表的第几个元素
- 可以将链表以left和right为界分为三部分,left之前的元素直接连接到新链表,left和right之间的元素通过栈的结构反转,而right之后的元素也直接连接到新链表
- 源码见下
源码及分析
/**
*
* @param head 链表头节点
* @param left 要反转的左侧索引
* @param right 右侧索引
* @return 反转后的新链表
*/
public ListNode reverseBetween(ListNode head, int left, int right) {
//创建栈用于辅助反转
Stack<ListNode> stack = new Stack<>();
//创建新链表
ListNode dummy = new ListNode();
//辅助指针用于向链表添加数据
ListNode tmp = dummy;
//记录当前是第几个节点
int cur = 1;
//先处理前right个元素
while (cur <= right) {
//从第left个节点开始,将元素反转,使用栈结构
if (cur >= left) {
ListNode node = new ListNode(head.val,null);
stack.push(node);
} else {
//left之前的元素直接连接到新链表
tmp.next = head;
tmp = tmp.next;
}
//head指针后移
head = head.next;
cur++;
}
//将栈中反转的元素连接到新链表的后面
while (!stack.isEmpty()) {
tmp.next = stack.pop();
tmp = tmp.next;
}
//将right之后的元素连接到链表
while (head != null) {
tmp.next = head;
tmp = tmp.next;
head = head.next;
}
return dummy.next;
}