题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
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 m int整型
* @param n int整型
* @return ListNode类
*/
public ListNode reverseBetween (ListNode head, int m, int n) {
// write code here
if(head.next == null){
return head;
}
if(m == n){
return head;
}
Stack<ListNode> stack = new Stack<>();
ListNode originHead = head;
ListNode mNode;
ListNode nNode;
//m节点的前一个节点
ListNode premNode = null;
//n节点的后一个节点
ListNode afternNode = null;
//把mNode到nNode这些节点放到stack中
for(int i = 1; i<m; i++){
if(i == m-1){
premNode = head;
}
head = head.next;
}
mNode = head;
stack.add(mNode);
for(int j=0; j<n-m; j++){
head = head.next;
stack.add(head);
}
nNode = head;
afternNode = nNode.next;
//对stack中的元素反转
ListNode node = stack.pop();
//区间内链表头结点
ListNode temHead = node;
do{
ListNode temNode = stack.pop();
node.next = temNode;
node = temNode;
}while(!stack.isEmpty());
//如果m==1,temHead做为最终列表的头节点
if(m == 1){
originHead = temHead;
}else{
premNode.next = temHead;
}
node.next = afternNode;
return originHead;
}
}
顺丰集团工作强度 414人发布