13调整数组顺序使奇数位于偶数前面
问题描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
实现思路
设置两个空数组,arr1,arr2,将奇数存在arr1中,偶数存在arr2中,最后用concat将俩个数组组合。
代码
function reorderArray(array) { var len=array.length; var arr1=[],arr2=[];//arr1存放奇数,arr2存放偶数 for(var i=0;i<len;i++){ if(arr[i]%2!=0){ arr1.push(arr[i]); }else{ arr2.push(arr[i]); } } return arr1.concat(arr2); }
14.链表中倒数第k个结点
问题描述
输入一个链表,输出该链表中倒数第k个结点。
实现思路
设两个指针,先让两个指针都指向头结点,让第一个正向走(k-1)步,到达第k个节点;两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
代码
function FindKthToTail(head,k){ if(head==null||k<=0){ return false; } var p1=head; var p2=head; for(var i=1;i<k;i++){ if(p1.next!=null){ p1=p1.next; }else{ return false; } } while(p1.next!=null){ p1=p1.next; p2=p2.next; } return p2; }
15 反转链表
问题描述
输入一个链表,反转链表后,输出链表的所有元素。
实现思路
- pHead为当前结点,如果当前结点为空的话,直接返回;
- pHead为当前结点,pre为当前结点的前一个结点,next为当前结点的下一个结点;
- 需要完成的目标是将pre-->pHead-->next1-->next2-->··· ···-->end反转为pre<--pHead<--next1<--next2<--··· ···<--end;
- pre结点可以用来反转方向,为了避免反转之后链表断开,用next结点暂时保存next1结点;
- 先用next保存pHead的下一个结点信息,保证单链表不会断裂;
- 保存之后,让pHead从指向next变成指向pre;
- 到此,完成了pre到pHead的反转,即pre<--pHead;
- 将pre,pHead,next依次向后移动一个结点。
- 循环操作,直到pHead为null,此时pre就是链表的最后一个结点,链表反转完毕,pre为反转后链表的第一个结点。
- 输出pre就是反转之后所得的链表。
代码
function isEmptyObject(obj) { for (var name in obj) { return false; } return true; } function ReverseList(pHead) { if (isEmptyObject(pHead)) { return false; } var pre = null; var next = null; while (pHead != null) { next = pHead.next; pHead.next = pre; pre = pHead; pHead = next; } return pre; }