如何对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++链表进行解读分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。