题解 | #链表内指定区间反转#
链表内指定区间反转
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) { if (head == null || head.next == null) { return head; } //遍历链表,重新添加成一个新的链表 ListNode cycleNode = head; ListNode curNode = null; int size = size(cycleNode); //前部的最后一个节点 ListNode frontNode = null; //尾部的第一个节点 ListNode afterNode = null; //只添加尾部的头节点,用flag判断 boolean afterFlag = true; for (int i = 0; i < size; i++) { //跳过前面m个,不要后面n个。 if ((i + 1) < m) { //尾节点设置为空 frontNode = addLast(frontNode, cycleNode.val); } if ((i + 1) >= m && (i + 1) <= n) { curNode = addFirst(curNode, cycleNode.val); } if (i + 1 > n && afterFlag) { afterNode = cycleNode; afterFlag = false; } cycleNode = cycleNode.next; } ListNode resultNode = null; if (frontNode != null) { resultNode = frontNode; while (curNode != null) { addLast(resultNode, curNode.val); curNode = curNode.next; } } else { resultNode = curNode; } while (afterNode != null) { addLast(resultNode, afterNode.val); afterNode = afterNode.next; } return resultNode; } /** * 在链表尾,增加单个末位节点 * * @param head * @param data */ protected ListNode addLast(ListNode head, int data) { ListNode addNode = new ListNode(data); if (head == null) { //这里其实也传不出去,只是没用上。 head = addNode; return head; } ListNode curNode = head; while (curNode.next != null) { curNode = curNode.next; } curNode.next = addNode; return head; } /** * 在链表头,增加单个首位节点 * * @param head * @param data 要增加的首位节点的值 * @return */ protected ListNode addFirst(ListNode head, int data) { ListNode curNode = new ListNode(data); curNode.next = head; head = curNode; return head; } /** * 得到单链表的长度 * * @param head * @return */ protected int size(ListNode head) { ListNode node = head; int index = 0; if (node == null) { return index; } while (node != null) { index++; node = node.next; } return index; } }