链表操作题目

将一个链表分为两个链表,奇数位置节点为一个链表,偶数位置节点为一个链表,并且两个链表反向。

代码:


#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值