创新工场软工题2-1

原创 2016年08月29日 09:57:10

题目:
1将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。

示例:
交换前链表的顺序 交换后链表的顺序
4→5→3→1→2 ==> 5→3→1→4→2
1 ==> 1 (链表仅含一个元素)
2→1 ==>1→2
==> (链表为空)
C/C++:
链表节点定义为:
struct node {
struct node *next;
int value;
};
struct node *swap(struct node *list);

Java:
链表节点定义为:
class Node {
public Node next;
public int value
}
Node swap(Node list)

注意点和要求如下:
1. swap函数要求对节点的指针/引用进行操作(不得创建任何新的链表节点)
2. 不得使用任何库函数/API,如需使用类似功能, 请自行实现
3. 不得将链表转化为其他类型数据结构再进行交换,如数组等


第一题完整代码:C++
//方法一:交换元素,复杂度较高,需要复制元素

// Source: 
// Author: YangQiang
// Date  : 2016-8-22

#include<iostream>
using namespace std;

struct node {
struct node *next;
int value;
};
struct node *swap(struct node *list);

struct node *swap(struct node *list)
{
    //处理不合理输入
    if(!list) return NULL;

    //定义两个指针,一个寻奇数,一个寻偶数
    struct node *p1=list;
    struct node *p2=list;
    while( p1 )
    {
        //先寻找偶数
        while( (p1->value)%2!=0 && p1->next)
            p1=p1->next;
        //再寻找偶数后面的奇数
        if(!p1->next) return list;
        p2=p1->next;
        while( (p2->value)%2==0 && p2->next )
            p2=p2->next;
        if(!p2->next) return list;
        //交换元素
        int temp=p1->value;
        p1->value=p2->value;
        p2->value=temp;

        p1=p1->next;    
    }
    return list;
}

struct node *CreatList(int *arr,int n)
{
    if(!arr || n<1) return NULL;
    struct node *head=new struct node;
    head->value=arr[0];
    struct node *p;
    p=head;
    for(int i=1; i<n; i++)
    {
        p->next=new struct node;
        p=p->next;
        p->value=arr[i];
    }
    p->next=NULL;
    return head;
}
int main()
{
    int test1[]={4,5,3,1,2};
    struct node *list1=NULL;
    list1=CreatList(test1,5);

    struct node *result=NULL;
    result=swap(list1);
}

方法二

//方法二:链表更换,时间复杂度降低
struct node *swap(struct node *list)
{
    //处理不合理输入
    if(!list) return NULL;

    //引入一个空的头结点
    struct node *Head=new struct node;
    Head->next=list;
    //定义两个指针,一个寻奇数,一个寻偶数
    struct node *p11=Head;
    struct node *p12=Head;
    struct node *p2=NULL;
    struct node *temp=NULL;

    //先寻找偶数开始的前一个位置p11
    while( p11->next && (p11->next->value)%2!=0 )
        p11=p11->next;
    if( !p11->next ) return list;
    p12=p11->next;

    while( p11 && p12 )
    {   
        //再寻找偶数结束位置p12
        while( p12->next && (p12->next->value)%2==0 )
            p12=p12->next;
        if(!p12->next) return Head->next;

        p2=p12->next; 
        //寻找其后连续奇数的终点p2
        while( p2->next && (p2->next->value)%2!=0 )
            p2=p2->next;

        //更新链表
        temp=p12->next;
        p12->next=p2->next;
        p2->next=p11->next;
        p11->next=temp;

        p11=p2;
        p12=p12->next;
    }
    return Head->next;
}

说明:方法二未贴出完整代码,验证时,只需把方法二算法部分和方法一算法部分替换即可。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

创新工场软工题2-2

题目:2给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, … )使得他们的和等于 n。你需要让平方数的个数最少。 给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。 ...

2011-2012年腾讯,创新工场,淘宝,百度,阿里,迅雷。网易游戏校园招聘面试题集锦(1-25题含答案)

2011-2012年腾讯,创新工场,淘宝,百度,阿里,迅雷。网易游戏校园招聘面试题集锦(1-25题含答案) 又是一年招聘季,小鸟我也在本季参加招聘,所以特在网上和群里面这里去年和今年的面试题,以备战...

雅虎搜狐创新工场微软_五道算法题

雅虎: 1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。   2.一个整数数组...
  • zqt520
  • zqt520
  • 2012年10月01日 23:40
  • 1214

2015创新工场校招研发笔试题

  • 2015年09月22日 16:45
  • 65KB
  • 下载

螺旋队列(螺旋矩阵)——创新工场面试总结2

创新工场会有一个统一的笔试,笔试过了之后会有面试,这个面试过了之后,可以参加后面的双选会,双选会的单位一般是从创新工场孵化成功的企业。 今天参的是第一场面试。开始聊项目,后面问了一个螺旋矩阵的问题,螺...

2012创新工场校园招聘笔试题

  • 2013年01月09日 17:03
  • 19KB
  • 下载

创新工场2013校园招聘题

  • 2012年09月24日 10:53
  • 881KB
  • 下载

创新工场O2O项目布丁六款生活类应用简评

在成立近一年后,创新工场旗下成员布丁昨日宣布获近千万美元A轮融资,由清科创投领投。这也是创新工场孵化的首个O2O项目。创始人徐磊称,布丁希望做中国最大的移动互联网e-coupon平台。布丁创立后,已先...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创新工场软工题2-1
举报原因:
原因补充:

(最多只允许输入30个字)