单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)

 
  1. #include <iostream>   
  2. using namespace std;  
  3.   
  4. /结点///   
  5. struct Node  
  6. {  
  7.     int data; //数据    
  8.     Node* next;//下一个结点   
  9.     
  10. };  
  11. /单链表/   
  12. class LinkList  
  13. {  
  14. public:  
  15.      void Init();  
  16.      void Create(int n); //创建带n个数据的单链表   
  17.      void Dis();  //输出结果   
  18.      bool Insert(int i, int data); //在索引为i的位置插入数据为data的结点   
  19.      bool Delete(int i); //删除索引为i的结点   
  20.      void Destroy(); //销毁链表   
  21.      int  GetLen(); //长度   
  22.      void Merge(LinkList& list); //归并单链表   
  23.      void Back(); //就地反转   
  24.      void Sort(); //排序   
  25.      bool HaveCircle(); //是否含有环   
  26.      Node* GetNode(); //获取头结点   
  27. private:  
  28.     Node* head; //头结点   
  29.    
  30. };  
  31.   
  32. ///单链表实现   
  33. void LinkList::Init()  
  34. {  
  35.     head = new Node();  
  36.     head->next = NULL;  
  37. }  
  38. void LinkList::Create(int n)  
  39. {  
  40.     Node* p = head;  
  41.     for (int i = 1 ; i <= n; ++i)  
  42.     {  
  43.         Node* temp = new Node();  
  44.         temp->data = i ;  
  45.         temp->next =NULL;  
  46.         p->next = temp;  
  47.         p = temp;  
  48.   
  49.     }  
  50.       
  51.   
  52.       
  53. }  
  54.   
  55. void LinkList::Dis()  
  56. {    
  57.     Node* p = head->next;  
  58.     while(p)  
  59.     {  
  60.         cout<<p->data<<"/t";  
  61.         p = p->next;  
  62.     }  
  63.     cout<<endl;  
  64. }  
  65.   
  66. bool LinkList::Insert(int i, int data)   
  67. {  
  68.     if (i <0 || i > GetLen())  
  69.     {  
  70.         return false;  
  71.     }  
  72.     Node* p = head;  
  73.     Node* q = head;  
  74.     for (int j = 0; j<i; j++)  
  75.     {  
  76.         q = p->next;  
  77.         p = p->next;  
  78.   
  79.     }  
  80.     Node* InsertNode = new Node;  
  81.     InsertNode->data = data;  
  82.     InsertNode->next = q->next;  
  83.     q->next = InsertNode;  
  84.     return true;  
  85. }  
  86.   
  87. bool LinkList::Delete(int i)  
  88. {  
  89.     if (i < 0 || i >= GetLen())  
  90.     {  
  91.       return false;  
  92.     }  
  93.     Node* p = head;  
  94.     Node* q  = head;   
  95.   
  96.     for (int j = 0; j<i; j++)  
  97.     {  
  98.        q = p->next;  
  99.        p = p->next;  
  100.          
  101.     }  
  102.    Node* DelNode = q->next;  
  103.    q->next = DelNode->next;  
  104.    delete DelNode;  
  105.    return true;  
  106.    
  107. }  
  108.   
  109. void LinkList::Destroy()  
  110. {  
  111.   Node* p = head->next;  
  112.     
  113.   while(p)  
  114.   {  
  115.       Node* temp = p;  
  116.       p = p->next;  
  117.       delete temp;  
  118.   }  
  119.   delete head;  
  120.   head->next = NULL;  
  121.     
  122. }  
  123.   
  124. int LinkList::GetLen()  
  125. {  
  126.     int count = 0;  
  127.     Node* p = head->next;  
  128.     while(p)  
  129.     {  
  130.         p = p->next;  
  131.         ++count;  
  132.     }  
  133.     return count;  
  134. }  
  135. void LinkList::Merge(LinkList& list)  
  136. {  
  137.     
  138.     Node* p = head->next;  
  139.     while (p->next)  
  140.     {  
  141.         p = p->next;  
  142.     }  
  143.    Node* listNode = list.GetNode();  
  144.    p->next = listNode->next;  
  145.      
  146.      
  147.   
  148. }  
  149.   
  150. Node* LinkList::GetNode()  
  151. {  
  152.     return head;  
  153. }  
  154.   
  155. void LinkList::Sort()   
  156. {  
  157.     //选择排序   
  158.     Node* p = head->next;  
  159.     while(p)  
  160.     {  
  161.         Node* small = p;  
  162.         Node* q = p->next;  
  163.         while(q)  
  164.         {  
  165.           if (q->data < small->data)  
  166.           {  
  167.               small = q;  
  168.   
  169.           }  
  170.   
  171.           q = q->next;  
  172.         }  
  173.   
  174.         if (p != small)  
  175.         {  
  176.             int temp;  
  177.             temp = p->data;  
  178.             p->data = small->data;  
  179.             small->data = temp;  
  180.         }  
  181.   
  182.         p = p->next;  
  183.     }  
  184.   
  185.       
  186.      
  187. }  
  188.   
  189. void LinkList::Back()    
  190. {  
  191.     /*先把原来的链表头结点断开 
  192.      *建立一个新的链表,然后把原来的链表插入到新链表的头部 
  193.      *最后把原来链表头部指向新链表,最后注意要释放新链表的头部 
  194.      *也就是最后一个元素**************************************/  
  195.     LinkList tempList;   
  196.     tempList.Init();  
  197.     Node* TempNode = tempList.GetNode();  
  198.     Node* n = TempNode;  
  199.     Node* p = head->next;  
  200.     while(p)     
  201.     {  
  202.         Node* q = p->next;  
  203.         Node* temp = p;  
  204.         temp->next = TempNode;  
  205.         temp->data = p->data;  
  206.         TempNode = temp;  
  207.         p = q;  
  208.           
  209.     }  
  210.       
  211.       
  212.     head->next = TempNode;  
  213.     Delete(GetLen() - 1);  
  214.       
  215.       
  216.   
  217. }  
  218.   
  219. bool LinkList::HaveCircle()  
  220. {  
  221.     Node* p = head;  
  222.     Node* q = head;  
  223.     while ((p->next != NULL) && (q->next != NULL) && (q->next->next != NULL) )  
  224.     {  
  225.        p = p->next;  
  226.        q = q->next->next;  
  227.        if (p == q)  
  228.        {  
  229.            return true;  
  230.        }  
  231.     }  
  232.   
  233.     return false;  
  234.       
  235. }  
  236.   
  237.   
  238. int main()  
  239. {  
  240.     LinkList list;  
  241.     list.Init();  
  242.     list.Create(4);  
  243.     LinkList list1;  
  244.     list1.Init();  
  245.     list1.Create(5);  
  246.     list.Merge(list1);  
  247.     list.Dis();  
  248.     list1.Dis();  
  249.     list1.Back();  
  250.     list1.Dis();  
  251.     list1.Sort();  
  252.     list1.Dis();  
  253.     cout<<list.HaveCircle()<<endl;  
  254.     return 0;  
  255. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值