给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)
例如:
链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。
``` .js
/**
var finalLinkHead = null;
for (var i = 0, count = parseInt(len / K); i < count + (len % K); i++) {
var j = i >= count ? 1 : K;
var newHead = new ListNode();
var tHead = newHead;
while (j > 0) {
tHead.val = tailNode.val;
tHead.next = new ListNode();
tailNode = tailNode.preNode;
if (j == 1) {
break;
}
tHead = tHead.next;
j--;
}
tHead.next = finalLinkHead;
finalLinkHead = newHead;
}
return finalLinkHead;
}
function ListNode(val) {
this.val = null;
this.next = null;
}
function iterateLink(link) {
var array = [];
while (link) {
array.push(link.val);
link = link.next;
}
return array;
}
function demo(array, K) {
var head = new ListNode();
var nowNode = head;
for (var i = 0; i < array.length; i++) {
nowNode.val = array[i];
if (i == array.length - 1) break;
nowNode = nowNode.next = new ListNode();
}
console.log(iterateLink(reverseLinkedArray(head, K)));
}
var timestart = new Date().getTime();
demo([1, 2, 3, 4, 5, 6, 7, 8], 3);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 1);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3);
demo([0, 1], 1);
console.log("use time = ", new Date().getTime() - timestart);
```
function reverse(arr,k){
var len = arr.length;
var num = len % k;
for(var i = num; i< len; i = i+k){
swap(i);
}
function swap(i){
var temp , begin = i, end = i+k-1;
while(end - begin > 0){
temp = arr[begin];
arr[begin] = arr[end];
arr[end] =temp;
begin ++
end --
}
}
return arr;
}
function reverse(arr,k){ var len = arr.length; var num = len % k; for(var i = num; i< len; i = i+k){ swap(i); } function swap(i){ var temp , begin = i, end = i+k-1; while(end - begin > 0){ temp = arr[begin]; arr[begin] = arr[end]; arr[end] =temp; begin ++ end -- } } return arr; }
是链表,不是数组
Most helpful comment
``` .js
/**
*
*/
function reverseLinkedArray(head, K) {
var len = 0;// 单链表长度
var nowNode = head,
preNode = null,
tailNode = null;
while (nowNode) {
nowNode.preNode = preNode;
preNode = nowNode;
if (nowNode.next == null) {
tailNode = nowNode;
}
nowNode = nowNode.next;
len++;
}
}
function ListNode(val) {
this.val = null;
this.next = null;
}
function iterateLink(link) {
var array = [];
while (link) {
array.push(link.val);
link = link.next;
}
return array;
}
function demo(array, K) {
var head = new ListNode();
var nowNode = head;
for (var i = 0; i < array.length; i++) {
nowNode.val = array[i];
if (i == array.length - 1) break;
nowNode = nowNode.next = new ListNode();
}
}
var timestart = new Date().getTime();
demo([1, 2, 3, 4, 5, 6, 7, 8], 3);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 1);
demo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3);
demo([0, 1], 1);
console.log("use time = ", new Date().getTime() - timestart);
```