1. 程式人生 > 實用技巧 >連結串列演算法總結

連結串列演算法總結

針對考研王道上的連結串列題目,總結出幾個經典的連結串列演算法,更新中。。。

//結構體
struct ListNode {
    int data;
    struct ListNode *next;
};

//建立
ListNode* readlist(){   //按照讀入順序建立連結串列,尾插法(帶頭結點)
    int n;
    ListNode *s=NULL,*L=NULL;
    while(1){
        ListNode* temp=(ListNode*)malloc(sizeof(ListNode)); //建立新的結點 
        scanf("%d",&n);
        
if(n==-1) break; temp->data=n; temp->next=NULL; if(L==NULL){ L=temp; } else{ s->next=temp; } s=temp; } return L; } //刪除連結串列中值為m的結點(帶頭結點的連結串列) ListNode *deletem( ListNode *L, int m ){ ListNode *p,*q; //
move用於往下走,q用於刪除時用 while(L&&L->data==m){ //如果頭結點的值剛好為m q=L; L=L->next; free(q); } p=L; while(p && p->next){ //p必須有 if(p->next->data==m){ q=p->next; p->next=q->next; free(q); }
else{ p=p->next; } } return L; } //將連結串列排序(簡單選擇排序) ListNode* selectsort(ListNode* L){ ListNode *p,*q,*small; //p為當前結點,從p往下找最小的結點small for(p=L;p->next!=NULL;p=p->next){ //一直往下遍歷 small=p; for(q=p->next;q;q=q->next){ //迴圈條件看一看 if(q->data < small->data){ small=q; } } if(small!=p){ //將small與p結點的值交換 int temp=p->data; p->data=small->data; small->data=temp; } } return L; } ListNode* reverse(ListNode* head){ //反轉連結串列,適合頭結點也有結點的情況 ListNode* pre=NULL; ListNode* curr=head; while(curr){ ListNode* next=curr->next; curr->next=pre; pre=curr; curr=next; } return pre; //不能返回curr,此時是NULL }