欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

合并单向循环链表

程序员文章站 2024-03-06 22:04:20
...

合并单向循环链表

题目

已知非空链表(a1,a2,a3,a4,a5,…,an)仅采用设置尾指针的单向链表作为存储结构(设尾指针为rear),请写一算法,将线性表改造为(a1,a2,a3,a4,…,an-1,an,an-1,…,a4,a3,a2,a1).
要求:改造后的线性表次奥用仅设置尾指针rear的单向链表,并且算法中只有一个循环列表。

分析

思路,结果是关于an对称的线性表。
第一步:设指针q从rear->link开始依次遍历链表,
第二步:并且记录链表的第一个结点,假如由指针r指向。
第三步:拷贝q所指的结点信息,假设有p所指。
第四步: 将p插入到尾指针rear所指的后面。
第五步:循环第三步,第四步。
第六步:将rear指向r所指的位置,形成循环。

示例

初始时:(a1,a2,a3,a4,a5,…,an)
改变后:(a1,a2,a3,a4,…,an-1,an,an-1,…,a4,a3,a2,a1)

代码

// 合并单向循环链表
LinkList MERGELIST(LinkList rear){    
	LinkList p,q,r,s;    
	q=rear->link;    
	p=(LinkList)malloc(sizeof(BNode));    
	p->data = q->data;  // 复制q所指的数据信息    
	r=p;  // 记录第一个元素的位置    
	p->link=rear->link; // 将第一个元素插入链表末尾    
	rear->link=p;    
	q=q->link;     // 指向第二个元素    
	while (q!=rear)    {        
		s = q->link;   // q所指的指针下移        
		p=(LinkList)malloc(sizeof(BNode));  // 申请空间        			         p->data=q->data;   // 复制q所指的数据信息        
		p->link=rear->link;  // 将p插入rear所指的后面        	  		         rear->link=p;        
		q=s;            // 获得下一个处理的结点   
	 }
         rear=r; // 将尾指针指向r的位置,尾指针。   
          return rear;    
  }