這部分主要介紹鏈表 包括基本的鏈表建立 刪除 插入,以及常用的鏈表環的檢測,環起點,鏈表交叉,交叉點

來源:互聯網
上載者:User
鏈表的建立 刪除 插入

      

#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;}

鏈表交叉

方法一:

其中一個鏈表的首尾相連,轉化為求鏈表是否有環,並求起點。

其他方法見<<編程之美>>。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.