鏈表的建立 刪除 插入
#include<iostream>using namespace std;template<typename T>class link{ public:link(T d,link* L){ Data=d; next=L;}link* NEXT()const{return next;}T ReadData()const{return Data;}//link* createLink();//void insertNode(link* head,T x,int loc);//void deleteNode(link* head,T x);T Data;link * next;};template<typename T>void createLink(link<T>** head){T x; link<T>* L; L=( link<T>*)malloc(sizeof(link<T>)); if(L==NULL) return;//再三強調,一定要這步 L->next=NULL; cout<<"請輸入資料:"<<endl; cin>>x; L->Data=x; bool bResult=true; link<T>* p=NULL; while(bResult) { cin>>x; if(x!=EOF) { p=( link<T>*)malloc(sizeof(link<T>)); p->next=NULL; } else break; if(p==NULL) break; p->Data=x; p->next=L->next; L->next=p; } *head=L; return ;}template<typename T>void insertNode(link<T>* head,T x,int loc){ if(head==NULL)return; link<T>* p=(link<T>*)malloc(sizeof(link<T>)); link<T>* pre=head;if(p==NULL) return; p->Data=x;for(int i=0;i<loc;++i) pre=pre->next;p->next=pre->next;//插入的關鍵代碼pre->next=p; return;}template<typename T >void deleteNode(link<T>** head,T x){link<T>* p=*head; link<T>* pre=NULL;if(x==p->Data)//處理頭結點{*head=p->next;free(p);return;}while(x!=p->Data){ pre=p; p=p->next;}pre->next=p->next;free(p);//釋放節點}template<typename T>void printfLink(link<T>* head){if(head==NULL) {cout<<"空鏈表";return;}link<T>* p;p=head;cout<<"列印元素:"<<endl;while(p){cout<<p->Data<<endl;p=p->next;}}int main(){link<int>* head=NULL;createLink( &head);printfLink( head);insertNode( head,100,1);printfLink( head);deleteNode( &head,1);printfLink( head);return 0;}
鏈表環的檢測和環起點的查詢
bool hasCircle(link<T>* head){if(head==NULL)return false; bool hasCircle=false; link<T>* slow=head; link<T>*fast=head; while(fast&&fast->next) { slow=slow->next; fast=fast->next->next; if(slow==fast) { hasCircle=true; break; } }return hasCircle;}template<typename T>link<T> beginOfCircle(link<T>* head){ if(head==NULL)return; link<T>* slow = head; link<T>* fast = head; while (fast && fast->link) { slow = slow->next; fast = fast->next->next; if (slow == fast) break; } if (fast == NULL || fast->next == NULL) //此時鏈表無環; return NULL; fast = head; while (slow != fast) { slow = slow->next; fast = fast->next; } return fast;}
鏈表交叉
方法一:
其中一個鏈表的首尾相連,轉化為求鏈表是否有環,並求起點。
其他方法見<<編程之美>>。