C++语言是学习数据结构的很好的学习工具,能够全面的理解了C++中C++链表的作用和用途,那么对于理解其C++描述,Java描述都就轻而易举了,以后学习什么语言都不会觉得难了。
单链表的交换节点的含义是:给定一个单链表,要求交换其中的任意两个节点。注意这里链表的头节点是不参与节点交换的。这个看上去是比较简单,但是实现起来却还是需要一定的基本功。
对于这个问题,关键是要用4个指针来保存两个交换的节点的前后节点位置,具体实现请参见实现源码。实际上,还有一个逻辑更加清晰的实现:只要用两个指针保存当前的两个交换节点的前一个节点。#t#
然后依次删除待交换节点,再在记录的前一个节点后交替插入删除的两个节点,也就是实际上将这个过程转化为了对于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;
- }