《剑指offer》JavaScript版13-15题

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 反转链表

问题描述

  输入一个链表,反转链表后,输出链表的所有元素。

实现思路

  1. pHead为当前结点,如果当前结点为空的话,直接返回;
  2. pHead为当前结点,pre为当前结点的前一个结点,next为当前结点的下一个结点;
  3. 需要完成的目标是将pre-->pHead-->next1-->next2-->··· ···-->end反转为pre<--pHead<--next1<--next2<--··· ···<--end;
  4. pre结点可以用来反转方向,为了避免反转之后链表断开,用next结点暂时保存next1结点;
  5. 先用next保存pHead的下一个结点信息,保证单链表不会断裂;
  6. 保存之后,让pHead从指向next变成指向pre;
  7. 到此,完成了pre到pHead的反转,即pre<--pHead;
  8. 将pre,pHead,next依次向后移动一个结点。
  9. 循环操作,直到pHead为null,此时pre就是链表的最后一个结点,链表反转完毕,pre为反转后链表的第一个结点。
  10. 输出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;
}

 

posted @ 2017-08-28 21:00  水迹仙涯  阅读(161)  评论(0编辑  收藏  举报