实现指定k内链表片段反转

public static ListNode reverseKGroup(ListNode head,int k){
    //start是每一组起始的位置;
    ListNode start  = head;
    //end是每一组终止的位置;
    ListNode end = getKGroupEnd(start, k);
    if(end ==null){
        return head;
    }
    //满足一组;
    head = end;
    reverse(start,end);//链表结构发生了改变;
    //start成为上一组的结尾点;
    // 记录上一组的结尾节点
    ListNode lastEnd = start;
    //下面还有结点的时候 才会进行下去;
    while(start.next!=null){
        start = start.next;
        end = getKGroupEnd(start, k);
        //end==null 表明下面不足k个节点;
        if(end ==null){
            return head;
        }
        reverse(start,end);//链表结构发生了改变;
        lastEnd.next = end;
    }
    return head;
}

/**
 * @param start 开始的节点
 * @param k k个节点之后
 * @return  k个节点之后是什么节点
 */
public static ListNode  getKGroupEnd(ListNode start, int k){
       while(--k>0 && start!=null){
           start = start.next;
       }
       return start;
}

/**
 * 实现一段链表的一个反转;
 *在这个过程中 start end
 * @param begin 起始节点
 * @param end   终止节点
 */
public static void reverse(ListNode begin, ListNode end) {
    end = end.next;
    ListNode pre = null;
    ListNode cur = begin;
    ListNode next = null;
    while (cur != end) {
        next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    //经历while循环 begin->end完成reverse;
    begin.next = end;
}

posted @ 2022-07-20 02:32  YuKiCheng  阅读(3)  评论(0编辑  收藏  举报  来源