【每日面试题】链表相关问题1

      题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。

链表结点的定义如下:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值