#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; } 相关链接: 1.http://blog.csdn.net/sayigood/archive/2009/09/02/4511469.aspx