- 1.题目
- 2.分析
- 3.代码
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
92. 反转链表 II
- 主要是将left--right位置链表反转。
- 反转之前需要将left前面和right后面断开,以left位置为头结点进行反转
- 原来left前驱的next应该指向right位置的结点,left位置的结点的next应该是原来right位置结点的后继。
- 所以,反转之前要找到left的前驱,left位置结点,right位置结点以及right位置的后继结点。
public ListNode reverseBetween(int left, int right) {
if (head == null || head.next == null) {
return head;
} else {
ListNode newHead = new ListNode(-1);//创建傀儡结点
newHead.next = head;
//1.找到left的 前驱pre
//从newHead 走 left-1 步
ListNode pre = newHead;
for (int i = 0; i < left - 1; i++) {
pre = pre.next;
}
//2.找到 right 结点
//再从pre 走 right-left+1 步
ListNode rightNode = pre;
for (int i = 0; i < (right - left + 1); i++) {
rightNode = rightNode.next;
}
//3.截取left--right链表
ListNode leftNode = pre.next;//left结点
ListNode suc = rightNode.next;//right的后继
//4.将 left之前 right之后 截断
pre.next = null;
rightNode.next = null;
//5.反转left--right
reverselinkedList(leftNode);
//6.将链表连接起来
pre.next = rightNode;
leftNode.next = suc;
return newHead.next;
}
}
public void reverselinkedList(ListNode leftNode) {
ListNode pre = null;
ListNode cur = leftNode;
while (cur != null) {
ListNode curNext = cur.next;
cur.next = pre;
pre = cur;
cur = curNext;
}
}
测试:
public static void main(String[] args) {
MylinkedList mylinkedList = new MylinkedList();
mylinkedList.addlast(1);
mylinkedList.addlast(2);
mylinkedList.addlast(3);
mylinkedList.addlast(4);
mylinkedList.addlast(5);
mylinkedList.display();
System.out.println("===============");
ListNode ret=mylinkedList.reverseBetween(2,4);
mylinkedList.display(ret);
}



