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
如果本篇文章对您有帮助的话,可以点个赞支持一下,感谢~