严奶奶的第2.37题:设以带头结点的双向循环链表表示的线性表L=(a1, a2, … an)。试写一个时间复杂度为O(n)的算法 ,将L改造为L=(a1, a3, …, an, … a4, a2)。
解题思路:按照正常的思路,我们会把偶数位序的结点从左到右依次插入到尾结点之后。因此,尾结点必须固定,再有一个指向偶数位序结点的遍历结点指针。基本操作即为:取出偶数位序结点,插入尾结点之后,继续相同操作。
我们先进行常规处理,如图:
特殊处理:
- 当只有一个或两个结点时,不需要进行链表操作
具体代码如下:
Status Algo(DuLinkList L)
{
//p:指向偶数位序的遍历结点
//head:指向奇数位序的遍历结点
//tail:指向原链表的尾结点