- 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); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)