再谈链表的 旋转 和 变形

面试中常问的链表问题通常有下面几类:

1、逆序:用三个指针在链表上滑动反转;或者用递归/栈 来处理

2、常数时间删除:替换法(用下一个节点的值替换当前节点,并删除下一节点)

3、倒数第K个节点(包括链表的中间节点,1/3节点等):使用两个指针间隔一定的值(或者每次滑动保持一定的差值)来实现

4、链表相交,环路 :使用一快一慢两个指针来实现

5、复杂链表的复制:在链表中为每个节点创建一个副本并链接在其后,之后再拆分

 

今天在做trend-micro笔试的时候碰到这样一个问题,将链表 1-->2-->3-->...-->n 转置为 1-->n-->2-->n-1-->3-->...

仔细一想,用递归,不需要压栈就能完成,下面给出代码:

LinkedList *GL_p;
int count = 0;

void ConvertRec(LinkedList* pCurrent)
{
    if(NULL == pCurrent) return;
    
   count++;
   ConvertRec(pCurrent->next);
   if(count>1)
   {
      LinkedList* pBackup = GL_p->next;
      GL_p->next = pCurrent;
      pCurrent->next = pBackup;
      GL_p = pBackup;

      count -= 2;
    }
}

LinkedList* Convert(LinkedList* pHead)
{
    GL_p = pHead;
    ConvertRec(pHead);
    GL_p->next = NULL;

    return pHead;             
}

  

 

 

Bar  member1;             //Wrong

Bar* member2;            //OK

Bar& member3;            //OK

static Bar member4;                           //OK 但是实际没创建?需要确认

Bar func(Bar member 5 )        //OK

posted on 2016-09-24 00:58  二十一级厨子  阅读(210)  评论(0编辑  收藏  举报

导航