再谈链表的 旋转 和 变形
面试中常问的链表问题通常有下面几类:
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