将一个链表分为两个链表,奇数位置节点为一个链表,偶数位置节点为一个链表,并且两个链表反向。
代码:
#include <iostream>
using namespace std;
//链表节点
template <typename Type>
struct Node
{
Type val;
Node *next;
};
//建立链表,依次输入各个节点值,以0结束
template <typename Type>
Node<Type>*& InitList(Node<Type> *&head)
{
Node<Type> *p = head;
cin>>p->val;
p->next = 0;
Node<Type> *q;
Type tmp;
while(cin>>tmp , tmp != 0)
{
q = new Node<Type>;
q->val = tmp;
q->next = 0;
p->next = q;
p = q;
}
cout<<"建立链表成功"<<endl;
return head;
}
//将cur所指节点反向
//bef上一个已经反向的节点
//aft是下一个将要反向的节点
template <typename Type>
void TurnBack(Node<Type> *&bef , Node<Type> *&cur , Node<Type> *&aft)
{
cur->next = bef;
bef = cur;
cur = aft;
if(aft == 0){}
else if(aft->next == 0)
{
aft = aft->next;
}
else aft = aft->next->next;
}
//将整个链表按照奇偶顺序分开,并且反向
template <typename Type>
void OddEvenTurnBack(Node<Type> *&head , Node<Type> *&headOdd , Node<Type> *&headEven)
{
if(head == 0) return;
Node<Type> *befOdd = 0;
Node<Type> *curOdd = head;
Node<Type> *aftOdd = 0;
if(curOdd->next != 0)
aftOdd = curOdd->next->next;
Node<Type> *befEven = 0;
Node<Type> *curEven = head->next;
Node<Type> *aftEven = 0;
if(curEven->next != 0)
aftEven = curEven->next->next;
while(curOdd != 0 && curEven != 0)
{
cout<<"CurOdd : "<<curOdd->val<<
"curEven: "<<curEven->val<<endl;
system("pause");
TurnBack(befOdd , curOdd , aftOdd);
TurnBack(befEven , curEven , aftEven);
}
if(curOdd != 0) TurnBack(befOdd , curOdd , aftOdd);
cout<<"反向成功"<<endl;
headOdd = befOdd;
headEven = befEven;
}
//主函数测试
int main()
{
Node<int> *head = new Node<int>;
head = InitList(head);
Node<int> *p = head;
while(p != 0)
{
cout<<p->val<<" ";
p = p->next;
}
cout<<endl;
Node<int> *headOdd = 0;
Node<int> *headEven = 0;
OddEvenTurnBack(head , headOdd , headEven);
Node<int> *pOdd = headOdd ;
Node<int> *pEven = headEven;
while(pOdd != 0)
{
cout<<pOdd->val<<" ";
pOdd = pOdd->next;
}
cout<<endl;
while(pEven != 0)
{
cout<<pEven->val<<" ";
pEven = pEven->next;
}
cout<<endl;
system("pause");
return 0;
}