导航

基于链表的奇偶节点的分离算法分析

基本原理:

  通过将链表中的奇偶节点依次分离,并存放在两个新链表中,然后将两个新得到的链表拼接,就能得到一条新的分离后的链表。

 

算法分析:

  第一,创建指针(数量随意)。本题采用5个指针,分别用来:p用来存放链表,q1和q11用来存放奇节点,q2和q22用来存放偶节点;

  第二,将指针赋予其意义。q11和q22分别用来存放头节点;

  第三,通过判断p指针是否为空,来控制函数是否进入循环体;

  第四,判断是哪一种节点,然后根据判断结果,将p当前的节点赋值给相应的指针,并将操作过的指针下移;

  第五,依次执行第四步骤,直到循环结束;

  第六,将奇偶节点拼接,并为尾节点赋值为空;

  第七,返回新链表;

 

代码展示:

//通过指针型函数,将分离后的链表返回;也可以

//本函数仅仅包含了函数功能的实现,并不支持输出

link solve(link& L)
{
    link p, q1, q11, q2, q22;   //定义链表指针,p用来存放链表,q1和q11用来存放奇节点,q2和q22用来存放偶节点;
    int j = 1;                  //定义一个变量,作用为描述节点的位置
    p = L->next;                //将链表的第一个有效数据的节点赋值给p指针
    q1 = new node; q2 = new node;  //设置一个空节点,将q1和q2分别指向该节点
    q1->next = q2->next = NULL; //将q1和q2下一个节点指向空
    q11 = q1; q22 = q2;         //保存q1和q2的头节点,并存放在q11和q22
    while (p) {                 //判断p是否为空,如果不为空则进入循环
        if (j++ % 2 == 0)       //判断是否为偶节点,如果是,则执行下面括号内的语句
        {                       
            q2->next = p;       //将p当前的节点赋值给q2的下一个节点
            q2 = p;             //将q2指针后移一个单位
        }   
        else {                  //否则,则执行下面括号内的语句
            q1->next = p;       //将p当前的节点赋值给q1的下一个节点
            q1 = p;             //将q1指针后移一个单位
        }
        p = p->next;            //将p指向下一个节点
    }
    q2->next = NULL;            //将q2的尾节点指向空
    q1->next = q22->next;       //将q2的头节点q22接到q1尾节点的后面
    return q11;                 //将q1的头节点q11返回
}

  

posted on 2020-11-23 20:18    阅读(714)  评论(0)    收藏  举报