技巧一:理解指针或引用的含义
技巧二:指针丢失和内存泄漏
技巧三:利用哨兵简化实现难度
技巧四:重点留意边界条件处理
如果链表未空时,代码是否能够正常运行
如果链表只包含一个节点时,代码能否正常运行
如果链表只包含两个节点时,代码能否正常运行
代码逻辑在处理头节点和尾节点的时候,能否正常运行
技巧五:举例画图
技巧六:多谢多练,没有捷径
单链表反转
Node* List::ReversalList()
{
Node* pPreNode = NULL;
Node* pNextNode = NULL;
Node* pCurrentNode = pHead;
while(pCurrentNode != NULL)
{
pNextNode = pCurrentNode->pNext;
if(pNextNode == NULL)
{
pHead = pCurrentNode;
}
pCurrentNode->pNext = pPreNode;
pPreNode = pCurrentNode;
pCurrentNode = pNextNode;
}
return pHead;
}
链表中环的检测
//fast slow pointer function
bool List::IsRecircleList()
{
Node *pSlow,*pFast;
pSlow = pFast = pHead;
while(pSlow != NULL && pFast->pNext->pNext != NULL)
{
pSlow = pSlow->pNext;
pFast = pFast->pNext->pNext;
if(pSlow == pFast)
return true;
}
return false;
}
两个有序链表的合并
删除链表倒数第n个节点
求链表的中间节点