数据结构学习系列之单向链表的翻转与排序

  • 单向链表的翻转:
  • 第0个数据结点后面的所有数据结点,依次头插头结点和第0个数据结点之间即可,代码如下:
  • 示例代码:
int filp_link_list(node_t *phead){
    
    

    if(NULL == phead){
    
    
        printf("入参为NULL,请检查..\n");
        return -1;
    }

    if(NULL == phead->next){
    
    

        printf("只有一个头结点\n");

        return -1;
    }

    if(NULL == phead->next->next){
    
    

        printf("只有一个数据结点\n");

        return -1;

    }

    node_t *p = phead->next;

    node_t *q = p->next;

    node_t *ptemp = NULL;

    p->next = NULL;

    while(NULL != q){
    
    

        ptemp = q->next;

        q->next = phead->next;

        phead->next = q;

        q = ptemp;

    }

    return 0;
}

  • 操作步骤:
  • 1.定义第0个数据结点指针,并将头结点的指针域指向第0个结点的指针,即node_t *p = phead->next
  • 2.定义第1个数据结点指针,并把第0个数据结点的指针域指向第1个数据节点的指针,即node_t *q = p->next
  • 3.定义一个指针,用来保存指针q的指针域,即ptemp = q->next,以便于循环遍历单向链表的所有数据结点,即每次循环结束前,令q = ptemp,就可以继续向后遍历其他的数据结点
  • 4.采用头插法的形式,并利用while循环,将第1个数据结点其以后的所有数据结点依次头插到头结点和第0个数据结点之间,直到指针q为NULL,即原单向链表第0个结点的指针域为NULL,就完成了单向链表的所有数据结点的翻转
  • 单向链表的排序:
  • 可以使用冒泡排序,即可完成单向链表所有数据结点的排序,代码如下:
  • 示例代码:
nt sort_link_list(node_t *phead){
    
    

    if(NULL == phead){
    
    
        printf("入参为NULL,请检查..\n");
        return -1;
    }

    if(NULL == phead->next){
    
    

        printf("只有一个头结点\n");

        return -1;
    }

    if(NULL == phead->next->next){
    
    

        printf("只有一个数据结点\n");

        return -1;

    }

    node_t *p = phead->next;
    node_t *q = NULL;
    int temp = 0;

    while(NULL != p->next){
    
    

        q = p->next;

        while(NULL != q){
    
    
            
            if(p->data > q->data){
    
    

                temp = p->data;

                p->data = q->data;

                q->data = temp;

            }
            q = q->next;
        }
        p = p->next;
        
    }

    return 0;

}
  • 操作步骤:
  • 1.定义指针p,让头结点的指针域指向p,即 node_t *p = phead->next
  • 2.定义指针q,让其他的结点指针域指向q,用于循环中,即 q = p->next;
  • 3.第一层循环结束的条件是NULL != p->next
  • 4.第二层循环结束的条件是NULL != q
  • 5.比较指针p和指针q的数据域不符合if条件语句内条件,就交换,然后指针p不动,向后移动指针q符合if条件语句内条件,指针p不动,向后移动指针q,直到指针q为NULL,最后最大值就是指针p指向的结点数据域,即p->data

猜你喜欢

转载自blog.csdn.net/qq_41878292/article/details/132698932