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