Java-面试链表-反转链表

目录

题目介绍:

题目分析

1、切割

2、反转

3、拼接

全部代码:


题目介绍:

Java-面试链表-反转链表_第1张图片

题目分析

与另外一个反转链表相似,不同点是:本题只进行部分反转,所以可以分成三步解题:1.切割--》2.反转--》3.拼接。

1、切割

切割的目的是后续反转更易进行。需要找到left为前一节点,以便存储left,还需要找到right。为了方便按照left和right移动一个指针prev,建立一个新的链表头,接到head前。

        ListNode newHead = new ListNode(-1);
        newHead.next = head;
        ListNode prev = newHead;
        //找到左节点的前一节点
        for (int i = 0;i < left -1;i++) {
            prev = prev.next;
        }
        //找到右边节点
        ListNode rightNode = prev;
        for (int i = 0;i < right-left+1;i++) {
            rightNode = rightNode.next;
        }
        //切割前将需要的反转的子链表的头尾记录
        ListNode leftNode = prev.next;
        ListNode curr = rightNode.next;
        
        //将子链表的头节点前一节点next和子链表的尾节点的next,置为null,完成切割。
        prev.next = null;
        rightNode.next = null;

2、反转

调用定义的反转函数将需要反转的子链表反转。

   private void reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = prev;
            prev = cur;
            cur = curNext;
        }
    }

3、拼接

利用原先记录的子链表头尾,通过改变指针完成拼接。

        prev.next = rightNode;
        leftNode.next = curr;

全部代码:

public ListNode reverseBetween(ListNode head, int left, int right) {
     ListNode newHead = new ListNode(-1);
     newHead.next = head;
     ListNode prev = newHead;
     //找到左节点的前一节点
     for (int i = 0;i < left -1;i++) {
         prev = prev.next;
     }
     //找到右边节点
     ListNode rightNode = prev;
     for (int i = 0;i < right-left+1;i++) {
         rightNode = rightNode.next;
     }
     //切割前将需要的反转的子链表的头尾记录
     ListNode leftNode = prev.next;
     ListNode curr = rightNode.next;
        
     //将子链表的头节点前一节点next和子链表的尾节点的next,置为null,完成切割。
     prev.next = null;
     rightNode.next = null;

     reverseList(leftNode);
     
     prev.next = rightNode;
     leftNode.next = curr;

     return newHead.next;
}
private void reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = prev;
            prev = cur;
            cur = curNext;
        }
}

你可能感兴趣的:(链表,java,面试)