循环链表合并(只带尾指针)
- 对循环链表,有时不给出头指针,而给出尾指针可以更方便的找到第一个和最后一个结点。
- 如何查找开始结点和终端结点?
- 开始结点:rear->next->next
- 终端结点:rear
- 循环链表的合并:
void Combine(LinkListLast Ta, LinkListLast Tb)
{
LNode *p;
p = Ta.rear->next; // 保存Ta存表头结点
Ta.rear->next = Tb.rear->next->next; // Ta表尾连结Tb首元结点
delete(Tb.rear->next); // ③释放Tb表头结点
Tb.rear->next = p; // ④Tb表尾连接Ta表头
}
代码实现
- main.cpp
-
运行结果#include<iostream> using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode; //定义尾指针 typedef struct { LNode *rear; }LinkListLast; //初始化 int InitList(LinkListLast &L) { L.rear = new LNode; L.rear->next = L.rear; return 1; } // 尾插法创建单循环链表 void CreateList(LinkListLast &L, int n) { L.rear = new LNode; L.rear->next = L.rear; printf("请输入链表元素值:\n"); for (int i = 0; i < n; i++) { printf("请输入第%d个元素的值:", i + 1); LNode *p; p = new LNode; scanf("%d", &p->data); p->next = L.rear->next; L.rear->next = p; L.rear = p; } } // 获取链表长度 int ListLength(LinkListLast L) { int length = 0; LNode *p; p = L.rear->next->next; while (p != L.rear->next) { // 当p不是头结点时,链表长度加1 p = p->next; length++; } return length; } // 遍历 void TraveList(LinkListLast L) { LNode *p; p = L.rear->next->next; while (p != L.rear->next) { printf("%d ", p->data); p = p->next; } printf("\n"); } /* 设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。 */ void Combine(LinkListLast L1, LinkListLast L2) { LNode *p; p = L1.rear->next; // 保存L1存表头结点 L1.rear->next = L2.rear->next->next; // L1表尾连结L2首元结点 delete(L2.rear->next); // ③释放L2表头结点 L2.rear->next = p; // ④L2表尾连接L1表头 } int main() { LinkListLast A; LinkListLast B; if (InitList(A)) { printf("链表A初始化成功!\n"); } else { printf("链表A初始化失败!\n"); } if (InitList(B)) { printf("链表B初始化成功!\n"); } else { printf("链表B初始化失败!\n"); } printf("请输入链表A的元素个数:"); int n1; scanf("%d", &n1); CreateList(A, n1); printf("遍历链表A:\n"); TraveList(A); printf("请输入链表B的元素个数:"); int n2; scanf("%d", &n2); CreateList(B, n2); printf("遍历链表B:\n"); TraveList(B); printf("合并A、B:\n"); Combine(A, B); printf("当前链表长度:%d\n", ListLength(B)); printf("遍历链表A+B:\n"); TraveList(B); // 由于只有尾指针,所以遍历合并后的链表要从第二个链表开始 system("pause"); return 0; }