单链表中的排序和逆置问题

单链表的排序问题:

class Node   //结点类
{
public:
    Node():next(NULL){}
    Node(int n,Node *p = NULL):value(n),next(p){}
    int value;
    Node *next;
};
class List
{
public:
    List();
    ~List();
    void Sort();
    void Sort1();
    void Resreve();
private:
    Node *m_pHead;
    Node *m_pTail;
};

方法一:

void List::Sort()     //排序
{
    Node *p = m_pHead;
    Node *q = m_pHead;
    int temp;
    for(p; p != NULL; p = p->next)    //趟数
    {
        for(q = m_pHead; q->next != NULL; q = q->next) // 比较次数 注意条件  每次都是从头开始
        {
            if(q->value > q->next->value)
            {
                temp = q->value;
                q->value = q->next->value;
                q->next->value = temp;
            }
        }
    }
}

方法二:

void List::Sort1()
{
    Node *p = m_pHead;
    Node *min = NULL, *minf = NULL;
    Node *newhead = NULL, *newtail = NULL;

    while(m_pHead)
    {
        min = m_pHead;
        for(p = m_pHead; p->next != NULL; p = p->next)   //查找最小的结点
        {
            if(min->value > p->next->value)  
            {
                minf = p;
                min = p->next;
            }
        }
        if(newhead == NULL)   //串接
        {
            newhead = newtail = min;
        }
        else
        {
            newtail->next = min;
            newtail = min;
        }
        if(min == m_pHead)          //最小的结点就是头结点
            m_pHead = m_pHead->next;
        else                        //否则就将最小节点的前一个节点与最小节点的下一个节点相连
            minf->next = min->next;
    }
    if(newhead != NULL)   
    {
        newtail->next = NULL;     //改变原来链表的头指针尾指针指向
        m_pHead = newhead;
        m_pTail = newtail;
    }
}

单链表的逆置问题:

void List::Resreve() //逆置
{
    Node *pf = NULL;
    Node *p = NULL;
    Node *pn = NULL;

    if(m_pHead == NULL || m_pHead->next == NULL)   //只有一个结点或者链表为空  直接返回
        return;
    pf = m_pHead;    //pf指针指向头指针
    p = pf->next;    //p指针指向pf指针的next
    pf->next = NULL;  //把头指针所指的结点的next置空

    while(p->next)    //开始循环  p的next不为空的情况下循环
    {
        pn = p->next;   // pn永远指向p的下一个 
        p->next = pf;    //然后将p的next指向改变
        pf = p;          //移动指针
        p = pn;         //移动指针
    }
    p->next = pf;      //改变最后一个结点的next指针
    m_pHead = p;      //最后将m_pHead的指向改到最后一个结点的位置
}

对于单链表的排序和逆置问题让我印象深刻。分享下方法,看的时候如果有不明白的可以画图,有助于理解。在学习的时候也很头疼,不过自己动手画一画会容易许多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值