C++中链表交替拆分的递归方法
给定一个单向链表作为输入。目标是将列表拆分为两个单链表,它们具有原始列表的备用节点。如果输入列表有节点a→b→c→d→e→f那么在分裂之后,两个子列表将是a→c→e和b→d→f。
我们将采用两个指针N1和N2,一个指向原始列表的头部,另一个指向头部→next。现在将两个指针移动到下一个节点的下一个并创建子列表。
例子
输入 -列表:-1→5→7→12→2→96→33
输出 -原始列表:1571229633
列表1:17233
列表2:51296
说明 -从1和5开始,下一个指向备用节点以创建如上所示的子列表。
输入 -列表:-13→53→90→18→44→11→99→32
输出 -原始列表:1353901844119932
列表1:13904499
列表2:53181132
说明-从13和53开始,下一个指向备用节点以创建如上所示的子列表。
下面程序中使用的方法如下
在这种方法中,我们将采用两个指针N1和N2,一个指向原始列表的头部,另一个指向头部→next。现在将两个指针移动到下一个节点的下一个并创建子列表。
取结构体Node与int数据部分和Node作为下一个指针。
函数addtohead(Node**head,intdata)用于向头部添加节点以创建单向链表。
使用上述函数创建一个单向链表,将head作为指向第一个节点的指针。
函数display(Node*head)用于打印从头节点开始的链表。
取两个节点指针node1和node2。
函数splitList(Node*head,Node**n1,Node**n2)获取节点指针并将n1指向head和n2指向head→原始字符串的next。
在里面调用split(*n1,*n2)将原始列表拆分为两个子列表
函数split(Node*N1,Node*N2)接受N1和N2指针并创建两个包含原始列表交替节点的子列表。
如果N1和N2都为空,则不返回任何内容。
如果N1→next不为空,则设置tmp=N1->next->next和N1->next=tmp;
fN2→next不为空然后设置tmp=N2->next->next和N2->next=tmp;
调用split(N1->next,N2->next);用于下一次迭代。
最后使用display().
示例
#include <bits/stdc++.h> using namespace std; struct Node { int data; struct Node* next; }; void addtohead(Node** head, int data){ Node* nodex = new Node; nodex->data = data; nodex->next = (*head); (*head) = nodex; } void split(Node* N1, Node* N2){ Node *tmp; if (N1 == NULL || N2 == NULL){ return; } if (N1->next != NULL){ tmp=N1->next->next; N1->next = tmp; } if (N2->next != NULL){ tmp=N2->next->next; N2->next = tmp; } split(N1->next, N2->next); } void splitList(Node* head, Node** n1, Node** n2){ *n1 = head; *n2 = head->next; split(*n1, *n2); } void display(Node* head){ Node* curr = head; if (curr != NULL){ cout<<curr->data<<" "; display(curr->next); } } int main(){ Node* head = NULL; Node *node1 = NULL, *node2 = NULL; addtohead(&head, 20); addtohead(&head, 12); addtohead(&head, 15); addtohead(&head, 8); addtohead(&head, 10); addtohead(&head, 4); addtohead(&head, 5); cout<<"原始清单:"<<endl; display(head); splitList(head, &node1, &node2); cout<<endl<<"清单1: "; display(node1); cout<<endl<<"清单2: "; display(node2); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出
原始清单: 5 4 10 8 15 12 20 清单1: 5 10 15 20 清单2: 4 8 12