文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何对C++链表进行解读分析

2023-06-17 17:17

关注

如何对C++链表进行解读分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

C++语言是学习数据结构的很好的学习工具,能够全面的理解了C++中C++链表的作用和用途,那么对于理解其C++描述,Java描述都就轻而易举了,以后学习什么语言都不会觉得难了。

单链表的交换节点的含义是:给定一个单链表,要求交换其中的任意两个节点。注意这里链表的头节点是不参与节点交换的。这个看上去是比较简单,但是实现起来却还是需要一定的基本功。

对于这个问题,关键是要用4个指针来保存两个交换的节点的前后节点位置,具体实现请参见实现源码。实际上,还有一个逻辑更加清晰的实现:只要用两个指针保存当前的两个交换节点的前一个节点。

然后依次删除待交换节点,再在记录的前一个节点后交替插入删除的两个节点,也就是实际上将这个过程转化为了对于C++链表的两个基本操作就可以完成了。但是要注意的是,这个实现中当两个交换节点是相邻节点的时候会出现问题,要单独处理,具体原因手工操作一次即可得知。后一种方法这里就不给出了。

实现代码中要说明的是,交换C++链表节点传入的是两个交换节点指针,但是为了测试简单实现,将这两个节点换成了待交换节点的关键字(值域),再到C++链表中定位。

具体实现源码为:

//Link.h  #include <iostream> #include <ctime> struct Node  {  public:  Node():_val(0),_next(NULL)  {  }  Node(int val):_val(val),_next(NULL)  {  }  Node(int val,Node* next):_val(val),_next(next)  {  }  ~Node()  {  if (_next)  delete _next;  }  public:  int _val;  Node* _next;  };  typedef Node* LinkNode;  Node* CreateLink(int len,int MAX_BOUND = 100)  {  srand((unsigned int)time(NULL));  LinkNode head = new Node(-1);  LinkNode tmp = head;  for (int i = 0; i < len; ++i)  {  //tmptmp = tmp->_next = new Node(rand() % MAX_BOUND);  tmptmp = tmp->_next = new Node(i);  }  tmp->_next = NULL;  return head;  }  void ExchLinkNode (const LinkNode head,int i1,int i2)  {  //head不准被交换  LinkNode prenode1 = NULL;  //保存待交换节点node1的前一个节点  LinkNode postnode1 = NULL; //保存待交换节点node1的后一个节点  LinkNode prenode2 = NULL;  //保存待交换节点node2的前一个节点  LinkNode postnode2 = NULL; //保存待交换节点node2的后一个节点  LinkNode node1 = NULL;     //保存待交换的节点  LinkNode node2 = NULL;     //保存待交换的节点  LinkNode tmp = head;  //定位两个节点  while ((tmp->_val != i1) && (tmp != NULL))  {  tmptmp = tmp->_next;  }  if (tmp == NULL)  {  return ;  }  else  {  node1 = tmp;  }  tmp = head;  while ((tmp->_val != i2) && (tmp != NULL))  {  tmptmp = tmp->_next;  }  if (tmp == NULL)  {  return ;  }  else  {  node2 = tmp;  }  //不得和头节点交换  if (node1 == head)  {  return ;  }  else if (node2 == head)  {  return ;  }  //自己和自己就不必交换了  if (node1 == node2)  {  return ;  }  tmp = head;  while (tmp->_next != node1)  {  tmptmp = tmp->_next;  }  prenode1 = tmp;  tmp = head;  while (tmp->_next != node2)  {  tmptmp = tmp->_next;  }

看完上述内容,你们掌握如何对C++链表进行解读分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯