(三)、单链表

单链表(带头结点)为空的判断条件是 L->next==NULL;

插入(图上)或删除(图下)元素只需改变指针(有头结点的特殊情况也是类似原理,头指针不变):

数据结构(知识点碎片四)_逆置

数据结构(知识点碎片四)_单链表_02

在一个长度为n(n>1)的带头结点的单链表h上,另设有尾指针r(指向尾结点),执行删除单链表中的最后一个结点操作与链表的长度有关。(该情况删除后尾指针就不知道该指向哪儿了,无关的情况是指不管链表多长都不影响操作设计)

  • 建表算法
//单链表建表基本算法之尾插法
void createLinkListR(LNode *&head)
{
    head = (LNode*)malloc(sizeof(LNode)); 
    head->next = NULL;
    LNode *p = NULL,*r = head; 
    int n;
    std::cin>>n; //scanf("%d", &n); 
    for (int i = 0; i<n; ++i)
    {
        p = (LNode*)malloc(sizeof(LNode)); 
        p->next = NULL;
        std::cin>>p->data; //scanf("%d", &(p->data)); //若有using namespace std则不用写std::
        p->next = r->next; //写这个语句就和在中间插入没有区别了,在尾插法中这一步可删除
        r->next = p; 
        r= p;
    }
}//用尾插法输入元素12345,则输出为12345

//单链表建表基本算法之头插法
void createLinkListH(LNode *&head)
{
    head = (LNode*)malloc(sizeof(LNode)); 
    head->next = NULL;
    LNode *p = NULL; //头插法中不需要标记尾指针的位置 
    int n;
    std::cin>>n; //scanf("%d", &n); 
    for (int i = 0; i<n; ++i)
    {
        p = (LNode*)malloc(sizeof(LNode)); 
        p->next = NULL;
        std::cin>>p->data; //scanf("%d", &(p->data)); //若有using namespace std则不用写std::
        p->next = head->next; //把在尾结点之后插入一个结点改为在头结点之后插入一个结点
        head->next = p; //头插法的头指针不需要移动
    }
} //用头插法输入元素12345,则输出为54321
  • 逆置
//逆置p->next到q之间的结点
while(p->next!= q)
{
    t = p->next;
    p->next = t->next;
    t->next = q->next; 
    q->next = t;
}
  • 求最值
//求最大值
LNode *p, *q;
int max = head->next->data; 
q=p=head->next; 
while (p != NULL)
{
    if (max < p->data)
    {
        max = p->data; 
        q= p;
    }
    p = p->next;
}

//求最小值
LNode *p, *q;
int min = head->next->data; 
q=p=head->next; 
while (p != NULL)
{
    if (min > p->data)
    {
        max = p->data; 
        q= p;
    }
    p = p->next;
}