雅虎面试题之链表操作

            题目:给定一个无环的单向单链表,将链表的奇数节点按顺序连接,而偶数节点则反向连接,并且将链表的奇数项节点与偶数项连接起来。

            要求:1.空间复杂度必须为常数;

                         2.时间复杂度不作要求。

   分析:假设没有空间复杂度的要求,那么可以将原链表的奇数项和偶数项先存下来,然后将偶数节点进行反转,最后将偶数项组成的链表接到奇数项链表的后面就满足题目的要求了。根据题目的要求,空间复杂度为常数,显然只能在原来的链表上进行操作 。但是还是可以借鉴前面的思路,即遍历原链表,并且将链表的奇数项依次连接,而偶数项依次连接,同时需要记住奇数项和偶数项链表的表头。然后对偶数项链表反转,最后将奇数项链表与偶数项链表连接起来。注意:如果原来的链表的节点为偶数项,那么奇数项链表的尾部与反转后的偶数项的链表的头部是连接在一起的;而如果原来的链表的节点为奇数项,那么奇数项链表的尾部与反转后的偶数项的链表的头部不是连接在一起的,那么还需要进行连接。

下面是具体的代码:

#include <iostream>
using namespace std;
struct Node{
    int value;
    Node* next;
};
Node* Reverse(Node* root )
{
   Node* prev=null;
   Node* curr=root;
   while(curr!=null)
   {
     Node *temp=curr->next;
     cur->next=prev;
     prev=curr;
     curr=temp;
   }
   return prev;
}
int main()
{
    Node *root;
    root->value=1;
    root->next=null;
    Node *pNode=root; 
    for(int i=0;i<10;i++)
    {
	Node *rear=new Node;
        rear->value=i;
        rear->next=null;
        pNode->next=rear;
        pNode=rear;        
    }
    pNode=root;
    while(pNode!=null)
    {
	cout<<pNode->value<<endl;
        pNode=pNode->next;
    }
    if(root==null)
       return 0;
    Node* oddHead=firstHead=root;
    Node* evenHead=second=root->next;
    pNode=root->next;
    bool flag=true;
    while(pNode!=null)
    {
    	if(flag)
        {
            firstHead=pNode;
            firstHead=first->next;
            flag=false;
        }
        else
        {
            secondHead=pNode;
            secondhead=secondHead->next;
            flag=true;
        }
        pNode=pNode->next;
    }
    evenHead=Reverse(evenHead);
    if (!flag) {
        first->next=evenHead;
    }
    pNode=root;
    while (pNode!=null) {
        cout<<pNode->value<<endl;
        pNode=pNode->next;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值