基于链表的奇偶节点的分离算法分析
基本原理:
通过将链表中的奇偶节点依次分离,并存放在两个新链表中,然后将两个新得到的链表拼接,就能得到一条新的分离后的链表。
算法分析:
第一,创建指针(数量随意)。本题采用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返回
}
专心看人间!
浙公网安备 33010602011771号