js刷题:leecode 25

原题:https://leetcode.com/problems/reverse-nodes-in-k-group/

题意就是给你一个有序链表。如1->2->3->4->5,还有一个输入K,让你以k为长度单位一段一段的翻转链表,如果长度不够k的部分则不翻转。

比如k=2,就两个两个翻转2->1->4->3->5,剩下5不够两个就不翻转,所以k=3的结果为3->2->1->4->5

解题思路:将链表按k分成N段,先探测是否满足k个,若满足则先将这一段翻转,翻转之后各段需要连接,所以要记录上一段的尾部。

遇到的问题:出现mle的错误,最后发现是在每一段翻转链表时应该将head节点指向空(因为翻转之后就变成了尾巴),如果不指向空则会形成一个环。

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
    var reverseKGroup = function(head, k) {
    if(head===null||head.next===null){
        return head ;
    }
    if(k<=1){
        return head ;
    }
    var current_node ;
    var current_next ;
    var iterator_node = head ;
    var group_head ;
    var pre_group_tail = head ;
    var no_k_element = false ;
    var fst = true ;
    var ans = head ;
    while(iterator_node!==null&&!no_k_element){
        current_node = iterator_node ;
        current_next = iterator_node.next ;
        if(!fst){
            pre_group_tail.next = iterator_node ;
        }
        //test is there k nodes left,and iterator_node mv k steps to position k+1
        for(var i=0;i<k;i++){
            if(iterator_node.next===null&&i!=(k-1)){
                no_k_element = true ;
                break ;
            }
            iterator_node  = iterator_node.next ;
        }
        if(!no_k_element){
            current_node.next = null ;
            group_head = current_node ;
            var temp_group_node ;
            for(var j=0;j<k-1;j++){
                temp_group_node = current_next.next ;
                current_next.next = current_node ;
                current_node = current_next ;
                current_next = temp_group_node ;
            }
            if(!fst){
                pre_group_tail.next = current_node;
                pre_group_tail = group_head ;
            }else{
                fst = false ;
                ans = current_node ;
            }
        }
    }
    return ans ;
    };