#ifndef LINKLIST_H_
#define LINKLIST_H_
struct Node
{
Node* ptr_;
int data_;
Node():ptr_(0), data_(0) {}
Node(int i):ptr_(0), data_(i) {}
};
class LinkList
{
public:
LinkList();
~LinkList();
// 在链表的最后一个节点之后添加节点node
void add_node(Node* node);
// 顺序打印链表节点数据
void disp();
// 交换链表的奇数节点和偶数节点
void swap_odd_even();
private:
// 清空链表
void clr_list();
// 表头指针
Node* first_;
// 表尾指针
Node* last_;
};
#endif
#include "LinkList.h"
#include "iostream"
using namespace std;
LinkList::LinkList()
{
first_ = new Node;
last_ = first_;
}
LinkList::~LinkList()
{
clr_list();
}
void LinkList::add_node(Node* node)
{
last_->ptr_ = node;
last_ = node;
}
void LinkList::clr_list()
{
Node* tmp;
while(first_->ptr_ != 0)
{
tmp = first_->ptr_;
first_->ptr_ = tmp->ptr_;
delete tmp;
}
}
void LinkList::disp()
{
Node* cur = first_->ptr_;
while(cur != 0)
{
cout<<cur->data_<<endl;
cur = cur->ptr_;
}
}
void LinkList::swap_odd_even()
{
Node* odd = first_->ptr_; // 初始奇数节点
Node* even = odd->ptr_; // 初始偶数节点
Node* pre = first_; // 初始前序节点
Node* next = even->ptr_; // 初始后序节点
while(1)
{
// 交换偶数奇数节点
pre->ptr_ = even;
even->ptr_ = odd;
odd->ptr_ = next;
pre = odd; // 更新pre
odd = next; // 更新odd
if(odd == 0)
{
last_ = odd;
break;
}
even = next->ptr_; // 更新even
if(even == 0)
{
last_ = even;
break;
}
next = even->ptr_; // 更新next
}
}
int main()
{
LinkList list;
for(int i=1; i<=11; i++)
{
list.add_node(new Node(i));
}
list.disp();
cout<<endl<<"奇数节点和偶数节点交换后的结果如下"<<endl;
list.swap_odd_even();
list.disp();
return 0;
}