原题: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 ; };