首先分析一波解题思路:
找到需要翻转的链表段[1,2,3,4,5] 2,4 即2,3,4需要翻转
保存翻转前面的链表[1],保存翻转节点后面的节点[5]
翻转需要翻转的链表段, 拼接前 + 翻转 + 后节点
public ListNode reverseBetween (ListNode head, int m, int n) { //1.定义一个前驱链表 ListNode prv = new ListNode(0); //2.实际操作的链表 ListNode cru = prv; //将head赋值给他 cru.next = head; //定义一个链表保存后节点 ListNode last = null; //保存需要翻转后的链表 ListNode revNode = null; //定义一个计数器 标记从哪里开始翻转 int count = 1; while(cru!=null && cru.next!=null){ //如果count == 2 if(count == m){ //从前面截取[1,2,3,4,5] 此时前节点应该为1; ListNode rev = cru.next; //定义一个临时链表保存开始翻转的链表[2,3,4,5] ListNode temp = rev; //将前驱链表滞空 cru.next = null; //定义计数器保存链表开始翻转到结束的长度n-m int time = 0; //链表一直下去 while(temp!=null && time < n-m){ temp=temp.next; time++; } //此时last == [5] last = temp.next; //此操作将rev=[2,3,4,5] -> rev[2,3,4] temp.next= null; //翻转[2,3,4] 并把后节点拼到翻转后的节点后面 revNode=rever(rev,last); //将翻转后的节点赋值给cru.next; cru.next=revNode; break; } else{ //不相等继续遍历 cru = cru.next; //计数+1 count++; } } return prv.next; } ListNode rever(ListNode head,ListNode last){ //翻转链表 ListNode prv = new ListNode(0); ListNode cru = prv; //定义一个栈先进后出 Stack<ListNode> stack = new Stack<>(); while(head!=null){ ListNode temp = head.next; head.next = null; stack.push(head); head = temp; } //循环出栈,即反转 while(!stack.isEmpty()){ ListNode pk = stack.pop(); cru.next = pk; cru = cru.next; } //把last节点拼到翻转节点后面 cru.next = last; return prv.next; }