对C 链表进行解读分析
创始人
2024-06-22 05:11:23
0

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

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

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

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

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

具体实现源码为:

  1. //Link.h  
  2.   #include  
  3.   #include  
  4.   struct Node  
  5.   {  
  6.   public:  
  7.   Node():_val(0),_next(NULL)  
  8.   {  
  9.   }  
  10.   Node(int val):_val(val),_next(NULL)  
  11.   {  
  12.   }  
  13.   Node(int val,Node* next):_val(val),_next(next)  
  14.   {  
  15.   }  
  16.   ~Node()  
  17.   {  
  18.   if (_next)  
  19.   delete _next;  
  20.   }  
  21.   public:  
  22.   int _val;  
  23.   Node* _next;  
  24.   };  
  25.   typedef Node* LinkNode;  
  26.   Node* CreateLink(int len,int MAX_BOUND = 100)  
  27.   {  
  28.   srand((unsigned int)time(NULL));  
  29.   LinkNode head = new Node(-1);  
  30.   LinkNode tmp = head;  
  31.   for (int i = 0; i < len; ++i)  
  32.   {  
  33.   //tmptmp = tmp->_next = new Node(rand() % MAX_BOUND);  
  34.   tmptmp = tmp->_next = new Node(i);  
  35.   }  
  36.   tmp->_next = NULL;  
  37.   return head;  
  38.   }  
  39.   void ExchLinkNode (const LinkNode head,int i1,int i2)  
  40.   {  
  41.   //head不准被交换  
  42.   LinkNode prenode1 = NULL;  //保存待交换节点node1的前一个节点  
  43.   LinkNode postnode1 = NULL; //保存待交换节点node1的后一个节点  
  44.   LinkNode prenode2 = NULL;  //保存待交换节点node2的前一个节点  
  45.   LinkNode postnode2 = NULL; //保存待交换节点node2的后一个节点  
  46.   LinkNode node1 = NULL;     //保存待交换的节点  
  47.   LinkNode node2 = NULL;     //保存待交换的节点  
  48.   LinkNode tmp = head;  
  49.   //定位两个节点  
  50.   while ((tmp->_val != i1) && (tmp != NULL))  
  51.   {  
  52.   tmptmp = tmp->_next;  
  53.   }  
  54.   if (tmp == NULL)  
  55.   {  
  56.   return ;  
  57.   }  
  58.   else  
  59.   {  
  60.   node1 = tmp;  
  61.   }  
  62.   tmp = head;  
  63.   while ((tmp->_val != i2) && (tmp != NULL))  
  64.   {  
  65.   tmptmp = tmp->_next;  
  66.   }  
  67.   if (tmp == NULL)  
  68.   {  
  69.   return ;  
  70.   }  
  71.   else  
  72.   {  
  73.   node2 = tmp;  
  74.   }  
  75.   //不得和头节点交换  
  76.   if (node1 == head)  
  77.   {  
  78.   return ;  
  79.   }  
  80.   else if (node2 == head)  
  81.   {  
  82.   return ;  
  83.   }  
  84.   //自己和自己就不必交换了  
  85.   if (node1 == node2)  
  86.   {  
  87.   return ;  
  88.   }  
  89.   tmp = head;  
  90.   while (tmp->_next != node1)  
  91.   {  
  92.   tmptmp = tmp->_next;  
  93.   }  
  94.   prenode1 = tmp;  
  95.   tmp = head;  
  96.   while (tmp->_next != node2)  
  97.   {  
  98.   tmptmp = tmp->_next;  
  99.   } 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...