题目:给定一个无环的单向单链表,将链表的奇数节点按顺序连接,而偶数节点则反向连接,并且将链表的奇数项节点与偶数项连接起来。
要求: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;
}