单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
2011-11-14 12:16
549 查看
#include <iostream>
using namespace std;
/////////结点///////
struct Node
{
int data; //数据
Node* next;//下一个结点
};
/////////////单链表/////////
class LinkList
{
public:
void Init();
void Create(int n); //创建带n个数据的单链表
void Dis(); //输出结果
bool Insert(int i, int data); //在索引为i的位置插入数据为data的结点
bool Delete(int i); //删除索引为i的结点
void Destroy(); //销毁链表
int GetLen(); //长度
void Merge(LinkList& list); //归并单链表
void Back(); //就地反转
void Sort(); //排序
bool HaveCircle(); //是否含有环
Node* GetNode(); //获取头结点
private:
Node* head; //头结点
};
///////////////////////单链表实现////////////////
void LinkList::Init()
{
head = new Node();
head->next = NULL;
}
void LinkList::Create(int n)
{
Node* p = head;
for (int i = 1 ; i <= n; ++i)
{
Node* temp = new Node();
temp->data = i ;
temp->next =NULL;
p->next = temp;
p = temp;
}
}
void LinkList::Dis()
{
Node* p = head->next;
while(p)
{
cout<<p->data<<"/t";
p = p->next;
}
cout<<endl;
}
bool LinkList::Insert(int i, int data)
{
if (i <0 || i > GetLen())
{
return false;
}
Node* p = head;
Node* q = head;
for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;
}
Node* InsertNode = new Node;
InsertNode->data = data;
InsertNode->next = q->next;
q->next = InsertNode;
return true;
}
bool LinkList::Delete(int i)
{
if (i < 0 || i >= GetLen())
{
return false;
}
Node* p = head;
Node* q = head;
for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;
}
Node* DelNode = q->next;
q->next = DelNode->next;
delete DelNode;
return true;
}
void LinkList::Destroy()
{
Node* p = head->next;
while(p)
{
Node* temp = p;
p = p->next;
delete temp;
}
delete head;
head->next = NULL;
}
int LinkList::GetLen()
{
int count = 0;
Node* p = head->next;
while(p)
{
p = p->next;
++count;
}
return count;
}
void LinkList::Merge(LinkList& list)
{
Node* p = head->next;
while (p->next)
{
p = p->next;
}
Node* listNode = list.GetNode();
p->next = listNode->next;
}
Node* LinkList::GetNode()
{
return head;
}
void LinkList::Sort()
{
//选择排序
Node* p = head->next;
while(p)
{
Node* small = p;
Node* q = p->next;
while(q)
{
if (q->data < small->data)
{
small = q;
}
q = q->next;
}
if (p != small)
{
int temp;
temp = p->data;
p->data = small->data;
small->data = temp;
}
p = p->next;
}
}
void LinkList::Back()
{
/*先把原来的链表头结点断开
*建立一个新的链表,然后把原来的链表插入到新链表的头部
*最后把原来链表头部指向新链表,最后注意要释放新链表的头部
*也就是最后一个元素**************************************/
LinkList tempList;
tempList.Init();
Node* TempNode = tempList.GetNode();
Node* n = TempNode;
Node* p = head->next;
while(p)
{
Node* q = p->next;
Node* temp = p;
temp->next = TempNode;
temp->data = p->data;
TempNode = temp;
p = q;
}
head->next = TempNode;
Delete(GetLen() - 1);
}
bool LinkList::HaveCircle()
{
Node* p = head;
Node* q = head;
while ((p->next != NULL) && (q->next != NULL) && (q->next->next != NULL) )
{
p = p->next;
q = q->next->next;
if (p == q)
{
return true;
}
}
return false;
}
int main()
{
LinkList list;
list.Init();
list.Create(4);
LinkList list1;
list1.Init();
list1.Create(5);
list.Merge(list1);
list.Dis();
list1.Dis();
list1.Back();
list1.Dis();
list1.Sort();
list1.Dis();
cout<<list.HaveCircle()<<endl;
return 0;
}
using namespace std;
/////////结点///////
struct Node
{
int data; //数据
Node* next;//下一个结点
};
/////////////单链表/////////
class LinkList
{
public:
void Init();
void Create(int n); //创建带n个数据的单链表
void Dis(); //输出结果
bool Insert(int i, int data); //在索引为i的位置插入数据为data的结点
bool Delete(int i); //删除索引为i的结点
void Destroy(); //销毁链表
int GetLen(); //长度
void Merge(LinkList& list); //归并单链表
void Back(); //就地反转
void Sort(); //排序
bool HaveCircle(); //是否含有环
Node* GetNode(); //获取头结点
private:
Node* head; //头结点
};
///////////////////////单链表实现////////////////
void LinkList::Init()
{
head = new Node();
head->next = NULL;
}
void LinkList::Create(int n)
{
Node* p = head;
for (int i = 1 ; i <= n; ++i)
{
Node* temp = new Node();
temp->data = i ;
temp->next =NULL;
p->next = temp;
p = temp;
}
}
void LinkList::Dis()
{
Node* p = head->next;
while(p)
{
cout<<p->data<<"/t";
p = p->next;
}
cout<<endl;
}
bool LinkList::Insert(int i, int data)
{
if (i <0 || i > GetLen())
{
return false;
}
Node* p = head;
Node* q = head;
for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;
}
Node* InsertNode = new Node;
InsertNode->data = data;
InsertNode->next = q->next;
q->next = InsertNode;
return true;
}
bool LinkList::Delete(int i)
{
if (i < 0 || i >= GetLen())
{
return false;
}
Node* p = head;
Node* q = head;
for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;
}
Node* DelNode = q->next;
q->next = DelNode->next;
delete DelNode;
return true;
}
void LinkList::Destroy()
{
Node* p = head->next;
while(p)
{
Node* temp = p;
p = p->next;
delete temp;
}
delete head;
head->next = NULL;
}
int LinkList::GetLen()
{
int count = 0;
Node* p = head->next;
while(p)
{
p = p->next;
++count;
}
return count;
}
void LinkList::Merge(LinkList& list)
{
Node* p = head->next;
while (p->next)
{
p = p->next;
}
Node* listNode = list.GetNode();
p->next = listNode->next;
}
Node* LinkList::GetNode()
{
return head;
}
void LinkList::Sort()
{
//选择排序
Node* p = head->next;
while(p)
{
Node* small = p;
Node* q = p->next;
while(q)
{
if (q->data < small->data)
{
small = q;
}
q = q->next;
}
if (p != small)
{
int temp;
temp = p->data;
p->data = small->data;
small->data = temp;
}
p = p->next;
}
}
void LinkList::Back()
{
/*先把原来的链表头结点断开
*建立一个新的链表,然后把原来的链表插入到新链表的头部
*最后把原来链表头部指向新链表,最后注意要释放新链表的头部
*也就是最后一个元素**************************************/
LinkList tempList;
tempList.Init();
Node* TempNode = tempList.GetNode();
Node* n = TempNode;
Node* p = head->next;
while(p)
{
Node* q = p->next;
Node* temp = p;
temp->next = TempNode;
temp->data = p->data;
TempNode = temp;
p = q;
}
head->next = TempNode;
Delete(GetLen() - 1);
}
bool LinkList::HaveCircle()
{
Node* p = head;
Node* q = head;
while ((p->next != NULL) && (q->next != NULL) && (q->next->next != NULL) )
{
p = p->next;
q = q->next->next;
if (p == q)
{
return true;
}
}
return false;
}
int main()
{
LinkList list;
list.Init();
list.Create(4);
LinkList list1;
list1.Init();
list1.Create(5);
list.Merge(list1);
list.Dis();
list1.Dis();
list1.Back();
list1.Dis();
list1.Sort();
list1.Dis();
cout<<list.HaveCircle()<<endl;
return 0;
}
相关文章推荐
- 单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 单链表的所有操作,检查是否有环,合并链表,逆置链表,排序链表......
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 数据结构与算法分析笔记与总结(java实现)--链表17:无环单链表判断是否相交问题
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)
- 数据结构与算法分析笔记与总结(java实现)--链表19:判断单链表是否相交问题
- 合并单链表,输出单链表中间元素,判断是否有环等
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单向列表是否包括环,若包含,环入口的节点计算 python实现
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断两个链表是否相交,若相交,求交点,考虑带环情况实现代码
- 判断单链表是否存在环以及两个链表是否相交
- 判断单链表是否存在环,判断两个链表是否相交
- 合并两个排序的链表java实现
- 用Java实现判断链表是否有环,环的大小,环的长度以及计算链表的长度