单链表的排序问题:
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的指向改到最后一个结点的位置
}
对于单链表的排序和逆置问题让我印象深刻。分享下方法,看的时候如果有不明白的可以画图,有助于理解。在学习的时候也很头疼,不过自己动手画一画会容易许多。