CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一道华为面试题

楼主shzwfq(静苑)2006-03-24 20:18:47 在 C/C++ / C++ 语言 提问

将一个单链表反序,只有一个链表头节点head,还有两个指向节点元素类型的指针p和q,不许申请新的节点及指针变量什么的.用c或c++实现算法.  
   
  我这道题没有作出来,比较菜哦,祝大家好运!! 问题点数:20、回复次数:26Top

1 楼citywanderer2005(流浪狗)回复于 2006-03-24 20:32:56 得分 5

int   MyList::Reverse()  
  {  
  ListNode   *ptr   =   _ptrFront;  
  ListNode   *ptrpre   =   0;  
   
  _ptrFront   =   _ptrEnd;  
  _ptrEnd   =   ptr;  
  while(ptr!=_ptrFront)  
  {  
  ListNode   *temp   =   ptr->Next();  
  ptr->Next(ptrpre);  
  ptrpre   =   ptr;  
  ptr   =   temp;  
  }  
  _ptrFront->Next(ptrpre);  
  return   0;  
  }Top

2 楼llf_hust()回复于 2006-03-24 20:33:36 得分 5

void   InvertLinkedList(   LinkList   &L   )    
  {  
    LinkList   p,s;            
  //   逆置头指针L所指链表  
              p   =   L;     L   =   NULL;                   //   设逆置后的链表的初态为空表  
              while   (   p   )   {                           //     p   为待逆置链表的头指针  
                  s   =   p;     p   =   p->next;         //   从   p   所指链表中删除第一个结点(s   结点)  
                  s->next   =   L;     L   =   s;         //   将   s   结点插入到逆置表的表头  
              }  
  }Top

3 楼PieroLsl(斑马王子)回复于 2006-03-24 20:38:53 得分 5

p=head->next;q=p->next;head=q->next;p->next=NULL;  
  do  
  {  
        q->next=p;  
        p=q;  
        q=head;  
        head=head->next;  
  }while(head);  
   
  令P指向节点1,Q指向节点2,Head指向节点3,由于P转换后为尾节点,所以P->Next指向NULL  
  循环移动,直到Head为NULLTop

4 楼citywanderer2005(流浪狗)回复于 2006-03-24 20:39:45 得分 5

哦,只有一个head,改一下:  
  int   MyList::Reverse()  
  {  
  ListNode   *ptr   =   _ptrFront;  
  ListNode   *ptrpre   =   0;  
   
  //_ptrFront   =   _ptrEnd;  
  //_ptrEnd   =   ptr;  
  while(ptr!=NULL)  
  {  
  ListNode   *temp   =   ptr->Next();  
  ptr->Next(ptrpre);  
  ptrpre   =   ptr;  
  ptr   =   temp;  
  }  
  //_ptrFront->Next(ptrpre);  
  _ptrFront   =   ptrpre;  
  return   0;  
  }Top

5 楼citywanderer2005(流浪狗)回复于 2006-03-24 20:46:29 得分 0

晕,没有别的指针,再改一下:  
  int   MyList::Reverse()  
  {  
  ListNode   *ptr   =   _ptrFront;  
  ListNode   *ptrpre   =   0;  
   
  //_ptrFront   =   _ptrEnd;  
  //_ptrEnd   =   ptr;  
  while(ptr!=NULL)  
  {  
  _ptrFront   =   ptr->Next();  
  ptr->Next(ptrpre);  
  ptrpre   =   ptr;  
  ptr   =   _ptrFront;  
   
  }  
  _ptrFront   =   ptrpre;  
  return   0;  
  }Top

6 楼citywanderer2005(流浪狗)回复于 2006-03-24 20:47:11 得分 0

不好意思啊,楼主Top

7 楼plamlover(火麒麟)回复于 2006-03-24 21:14:30 得分 0

规定时间不~~~~Top

8 楼yiyo2025(HenryKong)回复于 2006-03-24 22:00:29 得分 0

完整的例子,运行成功:  
   
  #include   <iostream.h>  
   
  struct   A  
  {  
  int   m_value;  
  A   *next;  
  };  
   
  A   *Reverse(A   *head)  
  {  
  A   *p,   *q;  
  if   (head->next   ==   NULL   ||   head->next->next   ==   NULL)  
  return   head;  
   
  p   =   head->next;  
  q   =   p->next;  
  p->next   =   head;  
  head->next   =   NULL;  
  while   (q   !=   NULL)    
  {  
  head   =   p;  
  p   =   q;  
  q   =   q->next;  
  p->next   =   head;  
  }    
  return   p;  
  }  
   
  int   main(){  
  A   array[5];  
   
  for(int   i=0;   i<5;   i++)  
  {  
  array[i].m_value   =   i;  
  if   (i   ==   4)  
  array[i].next   =   NULL;  
  else  
  array[i].next   =   &array[i+1];  
  }  
   
  A   *head   =   array;  
   
    head   =   Reverse(head);  
   
  while   (head   !=   NULL)  
  {  
  cout<<head->m_value<<endl;  
  head   =   head->next;  
  }  
   
  return   0;  
  }  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  Top

9 楼gjianpro(#ifndef _DEBUG)回复于 2006-03-24 22:12:55 得分 0

for(Node   *pre=0,*next;   head&&(next=head->next,head->next=pre,next);Top

10 楼vsfan(窘)回复于 2006-03-24 23:08:37 得分 0

不是吧  
  感觉上很简单的题目。。。  
  while   (!head)  
  {  
  p   =   head;  
  q   =   head->next;  
  head   =   head->next;  
  q->next   =   p;  
  }Top

11 楼BeginnerCpp(禅)回复于 2006-03-24 23:18:12 得分 0

递归,  
   
  递归是优雅的,可惜是不敢随便滥用的。  
   
   
  reverse(T*   t)  
  {  
          if(NULL   ==   t->nextPtr)  
          {         return   t->value;       }  
          else  
          {  
                    reverse(t);    
          }  
   
          return   t->value;  
  }Top

12 楼BeginnerCpp(禅)回复于 2006-03-24 23:35:27 得分 0

晕倒,看错题目了。  
   
   
  Top

13 楼linli2006(考研TOBEORNOTTOBE)回复于 2006-03-25 01:51:49 得分 0

在一本教材里头的习题里有出现Top

14 楼Lusoel(口哨)回复于 2006-03-25 06:44:28 得分 0

三个指针够啊!  
  先把Q和Head指向表尾结点,  
  P指向表头.  
  while(p   !=   Head)  
  {  
            q->Next   =   p;  
            p   =   p->Next;  
            q->Next   =   NULL;  
  }  
  Top

15 楼zhejiang9(千万别忘了结帖!^_^!!)回复于 2006-03-25 10:25:31 得分 0

yiyo2025(EricKong)    
  你写的这个函数有个很明显的BUG哦  
  if   (head->next   ==   NULL   ||   head->next->next   ==   NULL)  
  return   head;  
  ???  
  这样当链表只有两个接结点的时候,第三个结点为空,直接返回头指针,根本没改变两个结点的顺序!  
  我帮你改了一下,呵呵  
   
  A   *Reverse(A   *head)  
  {    
  A   *p1,*p2;  
  p1=head;  
  if(head->next==NULL)  
  return   head;  
  p2=p1->next;  
  p1->next=NULL;  
  while(p2->next!=NULL)  
  {  
                                      head=p2->next;  
  p2->next=p1;  
  p1=p2;  
  p2=head;  
  }  
                            p2->next=p1;  
          return   p2;  
  }  
  Top

16 楼yiyo2025(HenryKong)回复于 2006-03-25 21:05:44 得分 0

确实疏忽了,多谢。Top

17 楼wangcw_jun(军)回复于 2006-03-25 21:30:06 得分 0

#include<iostream>  
  using   namespace   std;  
  node   *   insertnode(list   *head)  
  {  
        node   *p,*q;  
        p=null;  
        while(head!=null)  
            {      
                  q=head->next;  
                  head->next=p->next;  
                  p->next=head;  
                  head=q;  
              }  
  return   q->next;  
  }  
  void   main()  
  {  
        list   *head;  
        node   *p;  
        p=insert(head);  
    cout<<p;  
  }Top

18 楼Could(翻墙鹦鹉)回复于 2006-03-25 21:33:12 得分 0

把head后面的节点一个个地拿到head的前面来,  
  我想写一下自己的代码,然后再来学学大家的。Top

19 楼manplus(魅力加加)回复于 2006-03-25 22:56:19 得分 0

markTop

20 楼Could(翻墙鹦鹉)回复于 2006-03-25 23:08:48 得分 0

我做了,  
  跟前面某些人的思路一样的。  
  #include   <iostream>  
  using   namespace   std;  
   
  class   node  
  {  
  public:  
  node(int   x):data(x),next(0){}  
  int   data;  
  node*   next;  
  };  
   
  node*   ReversList(node*   head)  
  {  
  node*   p=0;  
  node*   q=head;  
  while(head->next!=0)  
  {  
  p=head->next;  
  head->next=p->next;  
  p->next=q;  
  q=p;  
  }  
  return   q;  
  }  
   
  int   main()  
  {  
  node*   head=new   node(0);  
  node*   tail=head;  
  for(int   i=1;i<10;i++)  
  {  
  node*   p=new   node(i);  
  tail->next=p;  
  tail=p;  
  }  
  head=ReversList(head);  
  while(head->next!=0)  
  {  
  cout<<head->data<<endl;  
  head=head->next;  
  }  
  getchar();  
  return   0;  
  }Top

21 楼kendejihxx(冰赐&龙龙)回复于 2006-03-25 23:33:04 得分 0

mark   一下。我对C++不是很懂Top

22 楼iicup(双杯献酒)回复于 2006-03-26 15:51:00 得分 0

华为也出这种无聊题?Top

23 楼hu_cdut(古月)回复于 2006-03-27 08:48:28 得分 0

vsfan(窘):  
  你的算法错了!Top

24 楼plamlover(火麒麟)回复于 2006-03-28 12:51:05 得分 0

思考算法用了三分钟,写出完事程序用了近半个小时~~~太不熟了..  
  下面是本要的完事程序  
  #include<stdio.h>  
  #include<stdlib.h>  
  typedef   struct   node{  
  char   data;  
  struct   node   *link;  
  }node;  
  void   creat(node   *head)     //创建一个链表  
  {  
  char   t;  
  node   *n;  
  head->link=NULL;  
  //head->data=0;  
  printf("please   input   link   data   ");  
  scanf("%c",&t);  
  while(t!='#')  
  {  
  n=(node   *)malloc(sizeof(node));  
  n->data=t;  
  n->link=head->link;  
  head->link=n;  
  scanf("%c",&t);  
  }  
  }  
  void   show(node   head)       //打印所有结点  
  {  
  node   *p;  
  p=head.link;  
  while(p)  
  {  
  printf("%4c",p->data);  
  p=p->link;  
  }  
  }  
  void   reverse(node   *head)       //题目中所需要的函数  
  {  
  node   *p,*q;  
  p=head->link;  
  q=p->link;  
  while(q)  
  {  
  p->link=q->link;  
  q->link=head->link;  
  head->link=q;  
  q=p->link;  
  }  
  }  
  void   main()  
  {  
  node   head;  
  creat(&head);  
  show(head);  
  reverse(&head);  
  putchar('\n');  
  show(head);  
  }  
  Top

25 楼judely(蓝山|西堤岛|卡布奇诺)回复于 2006-03-30 10:48:54 得分 0

学习`~Top

26 楼wxiantong()回复于 2006-03-30 20:47:36 得分 0

easy!!!  
  void   reverse(T*head)  
  {  
        T*p=head,*q=head->next;  
        while(q)  
        {  
              head=q->next;  
              q->next=p;  
              p=q;  
              q=head;  
        }  
        head=p;  
  }Top

相关问题

  • 一道华为面试题(在线等)!!!!!!!!!!!!!!!
  • 华为面试题
  • 华为面试题
  • 华为面试题
  • 华为面试题
  • 华为一道面试题(SQL语句填空)
  • 华为笔试过了,面试时又出了一道题
  • 刚刚看到的一道华为面试题
  • 请教:华为面试题
  • 昨天华为面试题

关键词

  • c++
  • 结点
  • 节点
  • 指针
  • 算法
  • null
  • head
  • next
  • 指向
  • ptrfront

得分解答快速导航

  • 帖主:shzwfq
  • citywanderer2005
  • llf_hust
  • PieroLsl
  • citywanderer2005

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo