package com.camnter.basicexercises.linklist; import com.camnter.basicexercises.core.Node; /** * 反转部分链表 *

* 长度为 N * 将第 from 个节点和第 to 个节点这部分反转 *

* 注意情况过滤 1<=from<=to * 记录 from 前面的那个节点,就是第 from - 1 个节点,记作 fromPre 节点 * 记录 to 后面的那个节点,就是第 to + 1 个节点,记作 toNext 节点 * 因为反转的时候也需要这两个节点连接 *

* toNext 的连接 * 然后将 from - to 的部分反转,判断 是否 到了 toNext * fromPre 的连接 *

* 1 2 3 4 5 6,from = 2,to = 4 * 1 4 3 2 5 6 * * @author CaMnter */ public class ReversePartOfLinkList { private Node reverseLinkList(Node head, int from, int to) { int length = 0; Node node1 = head; Node fromPre = null; Node toNext = null; /** * 一趟循环到底 * 拿到 length, fromPre, toNext */ while (node1 != null) { length++; fromPre = length == from - 1 ? node1 : fromPre; toNext = length == to + 1 ? node1 : toNext; node1 = node1.next; } // 特殊情况处理 if (from > to || from < 1 || to > length) { return head; } // 拿到真正的 from node1 = fromPre == null ? head : fromPre.next; // 对接上 toNext Node node2 = node1.next; node1.next = toNext; // 开始反转 Node next; while (node2 != toNext) { next = node2.next; node2.next = node1; node1 = node2; node2 = next; } // 对接上 fromPre if (fromPre != null) { fromPre.next = node1; return head; } return node1; } public static void main(String args[]) { ReversePartOfLinkList reverseLinkList = new ReversePartOfLinkList(); Node.printLinkList(reverseLinkList.reverseLinkList(Node.getLinkList(), 2, 4)); } }