链表算法总结


针对考研王道上的链表题目,总结出几个经典的链表算法,更新中。。。

//结构体
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 
}

相关