温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-27 18:22:46 来源:亿速云 阅读:135 作者:柒染 栏目:编程语言

如何对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++链表进行解读分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI