单链表的所有操作,检查是否有环,合并链表,逆置链表,排序链表......

来源:互联网 发布:电信4g网络信号不好 编辑:程序博客网 时间:2024/05/09 13:46

单链表我能想起来的所有操作,这里是带头结点的单链表:

主要包括,创建,增加,删除,查找,逆置,排序,合并,检测是否有环,等等。不顾有一个没有实现,就是找到环的入口地址,这个和找环是一样的,找到有环了,一个慢指针重新开始从头走,一个从检测到环的那个点走。等他们相遇,就是环的入口地址。


#include <iostream>#include <algorithm>#include <vector>#include <iterator>using namespace std;//带头结点的单链表struct Node{int data;Node *next;};void Init(Node *p){if(p != NULL)p->next = NULL;}bool Insert_head(Node *p,int key){bool end = false;if(p != NULL){Node *tmp = new Node;tmp->data = key;tmp->next = p->next;p->next = tmp;end = true;}return end;}bool Delete_head(Node *p){bool end = false;if(p != NULL){if(p->next != NULL){Node *tmp = p->next;p->next = tmp->next;delete tmp;end = true;}}return end;}bool Delete_first_key(Node *p,int key){bool end = false;if(p != NULL){Node *tmp = p->next;while(tmp != NULL && tmp->data != key){p = tmp;tmp = tmp->next;}if(tmp !=NULL){p->next = tmp->next;delete tmp;end = true;}}return end;}Node *Find_value(Node *p,int data){if(p != NULL){p = p->next;while(p != NULL && p->data != data)p = p->next;}return p;}void Show(Node *p){if(p != NULL){Node *tmp = p->next;while(tmp){cout<<tmp->data<<" ";tmp = tmp->next;}cout<<endl;}}void Merge(Node *p1,Node *p2){if(p1 == NULL || p2 == NULL || p1 == p2)return ;Node *tmp1 = p1->next;Node *tmp2 = p1;Node *tmp3 = p2->next;while(tmp1 != NULL && tmp3 != NULL){if(tmp1->data < tmp3->data){tmp2 = tmp1;tmp1 = tmp1->next;}else{p2->next = tmp3->next;tmp3->next = tmp1;tmp2->next = tmp3;tmp3 = p2->next;tmp2 = tmp2->next;}}while(tmp3 != NULL){p2->next = tmp3->next;tmp3->next = tmp1;tmp2->next = tmp3;tmp3 = p2->next;tmp2 = tmp2->next;}p2->next = NULL;}void Show_fin_k(Node *p,int k){if(p != NULL){Node *tmp = p->next;int i = 0;while(i < k && tmp != NULL){i++;tmp = tmp->next;}if(i == k){Node *tmp1 = p->next;while(tmp != NULL){tmp = tmp->next;tmp1 = tmp1->next;}cout<<"fin_k:"<<tmp1->data<<endl;}}}bool Is_round(Node *p){bool end = false;if(p != NULL){Node *tmp1 = p;Node *tmp2 = p->next;while(tmp2 != NULL && tmp2 != tmp1){tmp1 = tmp1->next;if(tmp2->next == NULL)break;tmp2 = tmp2->next->next;}if(tmp2 == tmp1)end = true;}return end;}void Reverse(Node *p){if(p != NULL){Node *tmp1 = p;Node *tmp2 = p->next;if(tmp2 != NULL){Node *tmp3;while(tmp2 != NULL){tmp3 = tmp2->next;if(tmp1 == p)tmp2->next = NULL;elsetmp2->next = tmp1;tmp1 = tmp2;tmp2 = tmp3;}p->next = tmp1;}}}void Sort(Node *p){if(p != NULL){for(Node *p1 = p->next; p1 != NULL; p1 = p1->next){for(Node *p2 = p1->next; p2 != NULL; p2 = p2->next){if(p1->data > p2->data){int tmp = p1->data;p1->data = p2->data;p2->data = tmp;}}}}}void main(){int ar[] = {3,8,9,0,4,1,6,8,2,};int br[] = {6,13,16,2,5,4,0,11};int blen = sizeof(br)/sizeof(br[0]);int alen = sizeof(ar)/sizeof(ar[0]);Node head;Init(&head);Node head2;Init(&head2);for(int i = 0; i < alen; ++i){cout<<Insert_head(&head,ar[i]);}for(int i = 0; i < blen; ++i){cout<<Insert_head(&head2,br[i]);}cout<<endl;Show(&head);Show(&head2);int key;Sort(&head);Sort(&head2);Merge(&head,&head2);Show(&head);Reverse(&head);Show(&head);//Node *p1 = Find_value(&head,16);//Node *p2 = Find_value(&head,8);//p1->next = p2;//Show(&head2);//Show_fin_k(&head,4);//cout<<Is_round(&head)<<endl;//while(cin>>key,key != -1)//{////cout<<Delete_first_key(&head,key)<<endl;//cout<<Delete_head(&head)<<endl;//Show(&head);//}//while(cin>>key,key != -1)//{//if(Find_value(&head,key))//cout<<"yes"<<endl;//else//cout<<"no"<<endl;//}}


阅读全文
0 0
原创粉丝点击