题解 | #牛群的重新排列#
牛群的重新排列
https://www.nowcoder.com/practice/5183605e4ef147a5a1639ceedd447838?tpId=354&tqId=10590581&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj
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) {
ListNode listNode = new ListNode(-1);
listNode.next = head;
ListNode rightNode = head;
ListNode leftNode = listNode;
for (int i = 0; i < left - 1; i++) {
leftNode = leftNode.next;
}
for (int i = 0; i < right; i++) {
rightNode = rightNode.next;
}
leftNode.next = reverseLinkedList(leftNode.next,rightNode);
return listNode.next;
}
// 功能函数,翻转链表
public ListNode reverseLinkedList(ListNode left,ListNode right){
// right相当于以前的null,以前翻转整个链表,自然是到尾巴,这次就到right
ListNode prev = right;
// 这里的left相当于以前的head,只不过这次的头并不一定是第一个节点
ListNode curr = left;
// 循环条件也要响应改变,以前是head!=null,这次同理,curr!=right,直到2,3,4这几个节点翻转完毕
while(curr!=right){
// 常规翻转链表操作,先记录后面一个结点,然后让指向前一个,然后地址赋值
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
本题知识点分析:
1.前驱结点和后继结点
2.链表遍历和结点赋值
本题解题思路分析:
1.和翻转链表一个道理,只不过这次是翻转区间链表,那我只要把头和尾给进去就了,原来翻转整个链表相当于头结点到null
2.leftNode相当于头结点 rightNode相当于第一个节点
3.让leftNode走到节点1的位置,rightNode走到节点4的位置
4.leftNode的下一个节点就是翻转2,3,4,这三个结点,也就是reverseLinkedList(leftNode.next,rightNode);
5.最后返回listNode.next,因为new 的listNode相当于一个虚拟头结点,.next相当于给出第一个真实节点的地址
本题使用编程语言: Java
如果本篇文章对您有帮助的话,可以点个赞支持一下,感谢~
高频面试算法题解 文章被收录于专栏
高频面试算法题解,每天一小步,人生一大步,跟着一起刷起来!
