单链表的建立、排序和翻转

简介:

链表:

1、注意是否有带头结点。

2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。

3、单链表的插入、删除操作需要寻找前驱结点。

单链表的建立、排序和翻转,都是针对有头结点的单链表。

复制代码
#include <iostream>
using namespace std;

typedef struct Node
{
    int data;
    Node * next;
}Node,*List;

//顺序建表:尾插法
void CreateLinkList(List& L, int n)
{
    //  建立空表
    L = (List)malloc(sizeof(Node));
    L->next = NULL;    //空表
    List p = L;    //用p指向表尾
    //  插入元素
    for(int i=0; i<n; i++ )
    {
        int x;
        cin>>x;
        List s = (List) malloc(sizeof(Node));
        s->data = x;
        //  插入表尾
        s->next = p->next;
        p->next = s;
        p = s;    //  新的表尾
    }
}

//逆序建表:头插法
void CreateLinkList2(List& L, int n)
{
    //  建立空表
    L = (List) malloc(sizeof(Node));
    L->next = NULL;  // 空表
    //  插入元素
    for (int i=0; i<n; i++ )
    {
        int x;
        cin>>x;
        List s = (List) malloc(sizeof(Node));
        s->data = x;
        //  插入表头
        s->next = L->next;
        L->next = s;
    }
}

void PrintLinkList(List L)
{
   List p = L->next;
   while( p!=NULL )
   {
       cout<<p->data<<" ";
       p = p->next;
   }
   cout<<endl;
}

int GetLength(Node *head)
{
    int len = 0;
    List p = head->next;
    while(p)
    {
        ++len;
        p = p->next;
    }
    return len;
}

void DestroyList(List & L)
{
    List p = L;
    List q = NULL;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

//采用插入法将单链表中的元素排序。
void InsertionSort(List & L)
{
    List h=L->next;      // 原链表
    L->next=NULL;      // 新空表
    List s=NULL,p=NULL;
    while(h)
    {
        // 从原链表中取下结点s
        s=h;  h=h->next;
        // 在新表中查找插入位置
        p=L;
        while (p->next && p->next->data<=s->data)
        p=p->next;
        // 在p之后插入s
        s->next=p->next;
        p->next=s;
    }
}

//采用选择法将单链表中的元素排序。
void SelectionSort(List & L)
{
    List p=L;
    List q=NULL,s=NULL,m=NULL;
    while (p->next)
    {
        // 选择最小(从p->next至表尾)
        q=p;     // 最小元素的前驱q
        s=p;
        while(s->next)
        {
            if(s->next->data<q->next->data)  q=s;
            s=s->next;
        }
        m=q->next;     // 找到最小m
        // 最小元素m插入有序序列末尾(p之后)
        if (q!=p)
        {
            q->next=m->next;      // 解下最小m
            m->next=p->next;      // 插入p之后
            p->next=m;
        }
        p=p->next;     // L->next至p为有序序列
    }
}

//单链表就地逆置
void ReverseList(Node* h)
{
    Node* p = h->next;  // 原链表
    h->next = NULL; // 新表(空表)
    while(p != NULL)
    {
        Node* q = p->next;  // 保存下个结点q
        p->next = h->next;
        h->next = p;
        p = q;
    }
}

int main()
{
    List head = NULL;
    CreateLinkList(head,5);
    PrintLinkList(head);
    cout<<"Len: "<<GetLength(head)<<endl;

    InsertionSort(head);
    PrintLinkList(head);

    ReverseList(head);
    PrintLinkList(head);

    DestroyList(head);

    return 0;
}
复制代码

 

 

作者: 阿凡卢
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2622323.html
相关文章
|
4月前
|
算法 Java
「LeetCode」25. K 个一组翻转链表
「LeetCode」25. K 个一组翻转链表
27 0
|
3月前
leetcode-25:K 个一组翻转链表
leetcode-25:K 个一组翻转链表
16 0
|
5月前
链表中的节点每k个一组翻转
链表中的节点每k个一组翻转
24 0
|
8月前
|
算法
LeetCode-25 K个一组翻转链表
LeetCode-25 K个一组翻转链表
|
10月前
|
算法 安全 Swift
LeetCode - #25 K 个一组翻转链表
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
10月前
|
算法
Leecode 25. K 个一组翻转链表
Leecode 25. K 个一组翻转链表
42 0
leetcode 25 k个一组的翻转链表
leetcode 25 k个一组的翻转链表
62 0
leetcode 25 k个一组的翻转链表
|
算法 Java
【K 个一组翻转链表】
【K 个一组翻转链表】
|
算法
LeetCode 25K 个一组翻转链表&26删除排序数组中的重复项
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
69 0
LeetCode 25K 个一组翻转链表&26删除排序数组中的重复项

热门文章

最新文章