链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,
还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
{
ListNode* pNode=pListHead;
while(pNode->m_pNext!=pToBeDeleted)
pNode=pNode->m_pNext;
pNode->m_pNext=pToBeDeleted->next;
delete pToBeDeleted;
}
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:这是一道很有意思的面试题。
该题以及它的变体经常出现在各大公司的面试、笔试题中。
(递归方法)
void printFromTail(ListNode* pListHead)
{
if(pListHead!=NULL)
{
printFromTail(pListHead->m_pNext);
cout<<pListHead->m_nKey<<endl;
}
}
(非递归方法)
void printFromTail(ListNode* pListHead)
{
vector<int> list;
while(pListHead!=NULL)
{
list.push_back(pListHead->m_nKey);
pListHead=pListHead->m_pNext;
}
int j=list.size();
for(int i=0;i<j;i++)
cout<<list.pop_back()<<"\t";
cout<<endl;
}
题目:输入一个单向链表,输出该链表中倒数第k个结点。
链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
ListNode printKNode(ListNode* pListHead,int k)
{
ListNode* pNode1,pNode2;
pNode1=pListHead;
pNode2=pListHead;
while(k>0&&pNode1!=NULL)
{
pNode1=pNode1->m_pNext;
k--;
}
while(pNode1->m_pNext!=NULL)
{
pNode1=pNode1->m_pNext;
pNode2=pNode2->m_pNext;
}
return pNode2;
}
题目来源于: http://blog.csdn.net/v_july_v/article/details/6076139