如何在C++中分割给定的链表


链表是一种线性数据结构,其中每个节点有两个块,一个块包含节点的值或数据,另一个块包含下一个字段的地址。

假设我们有一个链表,每个节点包含数据和一个指向链表下一个节点的指针。任务是分割给定的链表。分割链表意味着我们必须将列表中奇数索引的节点和偶数索引的节点分开。

解决这个问题的方法

为了分割给定的链表,我们将分别为奇数索引、偶数索引和偶数索引的值引入三个指针。之后,我们将遍历整个链表并用某个值初始化指针。

在链表中,索引从“1”开始,因此对于任何特定字符串,列表的第一个节点将始终被视为奇数索引节点。但是,下一个节点被视为偶数索引节点。

  • 取一个包含数据和指向下一个节点的指针的链表。
  • 函数segregateList(listnode *head) 获取指向头节点的指针,并返回分割后的链表作为输出。
  • 初始化三个指针oddIndex、evenIndex和evenHead,它们当前都指向列表的头。
  • 遍历整个链表,并将oddIndex的next指针初始化为evenIndex的next指针。
  • 现在遍历整个列表,并将evenIndex的next指针初始化为oddIndex的next指针。
  • 返回头指针。

示例

在线演示

#include <iostream>
using namespace std;
class node {
   public:
      int data;
   node * next;
   node(int d) {
      data = d;
      next = NULL;
   }
};
node * segregateList(node * head) {
   if (head == NULL) {
      return NULL;
   }
   node * oddIndex = head;
   node * evenIndex = head -> next;
   node * evenHead = evenIndex;
   while (evenIndex != NULL and evenIndex -> next != NULL) {
      oddIndex -> next = evenIndex -> next;
      oddIndex = oddIndex -> next;
      evenIndex -> next = oddIndex -> next;
      evenIndex = evenIndex -> next;
   }
   oddIndex -> next = evenHead;
   return head;
}
void insertAtNode(node * & head, int data) {
   node * n = new node(data);
   n -> next = head;
   head = n;
}
void print(node * head) {
   while (head != NULL) {
      cout << head -> data << "->";
      head = head -> next;
   }
}
int main() {
   node * head = NULL;
   // It could be possible that the head node contains NULL Value.
   insertAtNode(head, 5);
   insertAtNode(head, 8);
   insertAtNode(head, 3);
   insertAtNode(head, 1);
   insertAtNode(head, 2);
   print(head);
   cout << endl;
   segregateList(head);
   print(head);
}

运行上述代码将生成以下输出:

输出

2->3->5->1->8->

给定的链表是:2->1->3->8->5->。分割链表后,将产生以下输出:2->3->5->1->8->。

更新于:2021年2月23日

167 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告