单向链表的七个问题(添加、插入、删除、遍历、合并、逆序、判断是否循环)
// LianBiao.cpp : 定义控制台应用程序的入口点。
//**********************************************************************
//-----链-------------------- 添加 -------------------------
//-----表-------------------- 插入 -------------------------
//-----操-------------------- 删除 -------------------------
//-----作-------------------- 遍历 -------------------------
//**********************************************************************
#include "stdafx.h"
#include <iostream>
using namespace std;
//**********************************************************************
// 定义一个节点结构体
//**********************************************************************
struct node
{
int data;
node* next;
node(int data)
{
this->data = data;
next = NULL;
}
};
//**********************************************************************
// 定义一个链表类
//**********************************************************************
class List
{
public:
node* head;
List()
{
head = NULL;
}
//**********************************************************************
// 链表的添加->111111
//**********************************************************************
void add(int data)
{
if(!head)
head = new node(data);
else
{
node* temp = head;
while(temp->next)
temp = temp->next;
temp->next = new node(data);
}
}
//**********************************************************************
// 链表的插入->222222
//**********************************************************************
void insert(int position,int data)
{
if(position == 1)
{
node* temp = head;
head = new node(data);
head->next = temp;
}
else
{
int count = 1;
node* temp = head;
while(temp->next)
{
count++;
if(count == position)
break;
else
temp = temp->next;
}
node* t = temp->next;
temp->next = new node(data);
temp->next->next = t;
}
}
//**********************************************************************
// 链表的删除->333333
//**********************************************************************
void del(int position)
{
if(position == 1)
{
head = head->next;
}
else
{
int count = 1;
node* temp = head;
while(temp->next)
{
count++;
if(count == position)
break;
else
temp = temp->next;
}
temp->next = temp->next->next;
}
}
//**********************************************************************
// 链表的遍历->444444
//**********************************************************************
void print(node* root)
{
while(root)
{
cout<<root->data<<" ";
root = root->next;
}
cout<<endl;
}
//**********************************************************************
// 链表的逆序->555555
//**********************************************************************
void reverse(node* &head) //注意此处需引用
{
if(head == NULL || head->next == NULL)
return;
node *p1,*p2,*p3;
p1 = head;
p2 = p1->next;
p1->next = NULL;
while(p2)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
head = p1;
return;
}
//**********************************************************************
// 链表的合并->666666
//**********************************************************************
void combine(node* &head1,node* &head2)
{
node* p1 = head1 , *k1;
node* p2 = head2 , *k2;
while(p1)
{
k1 = p1->next;
k2 = p2->next;
p1->next = p2;
p2->next = k1;
p1 = k1;
p2 = k2;
}
}
//**********************************************************************
// 链表的判断(是否是循环链表)->777777
//**********************************************************************
bool judge(node* head)
{
if(!head || !head->next)
return 0;
node* slow = head;
node* fast = head->next;
while(fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
if(fast == slow)
return 1;
}
return 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"测试 ->111111"<<endl;
List l1;
l1.add(1);
l1.add(2);
l1.add(3);
l1.add(4);
l1.add(5);
l1.print(l1.head); // 测试 ->444444
cout<<"测试 ->222222"<<endl;
List l2;
l2.add(1);
l2.add(2);
l2.add(3);
l2.add(4);
l2.add(5);
l2.insert(1,88);
l2.insert(4,99);
l2.print(l2.head);
cout<<"测试 ->333333"<<endl;
List l3;
l3.add(1);
l3.add(2);
l3.add(3);
l3.add(4);
l3.add(5);
l3.del(1);
l3.del(3);
l3.print(l3.head);
cout<<"测试 ->555555"<<endl;
List l5;
l5.add(1);
l5.add(2);
l5.add(3);
l5.add(4);
l5.add(5);
l5.reverse(l5.head);
l5.print(l5.head);
cout<<"测试 ->666666"<<endl;
List l6;
l6.add(1);
l6.add(3);
l6.add(5);
l6.add(7);
l6.add(9);
List l8;
l8.add(2);
l8.add(4);
l8.add(6);
l8.add(8);
l8.add(10);
l6.combine(l6.head,l8.head);
l6.print(l6.head);
cout<<"测试 ->777777"<<endl;
List l7;
l7.add(1);
l7.add(2);
l7.add(3);
l7.add(4);
/*l7.head->next->next->next = l7.head->next;*/
//简单测试:加这句为环表(输出:1) 不加则不是(输出:0)
cout<<l7.judge(l7.head)<<endl;
return 0;
}