C++程序 将链表中的偶数节点和奇数节点分离
什么是链表
在计算机科学中,链表是一种线性数据结构,其中元素的线性顺序不是由它们在内存中的物理位置给出的,而是每个元素存储了下一个元素的地址。链表数据结构允许插入和移除表上任意位置的节点,这使得链表在某些应用上比数组更具优势。
如何将链表中的偶数节点和奇数节点分离
下面是将链表中的偶数节点和奇数节点分离的C++代码示例:
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == NULL || head -> next == NULL || head -> next -> next==NULL) {
return head;
}
ListNode* odd = head;
ListNode* even = head -> next;
ListNode* evenHead = even;
while(even != NULL && even -> next != NULL) {
odd -> next = even -> next;
odd = odd -> next;
even -> next = odd -> next;
even = even -> next;
}
odd -> next = evenHead;
return head;
}
};
int main() {
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(4);
ListNode* node5 = new ListNode(5);
ListNode* node6 = new ListNode(6);
node1 -> next = node2;
node2 -> next = node3;
node3 -> next = node4;
node4 -> next = node5;
node5 -> next = node6;
Solution solution;
ListNode* head = solution.oddEvenList(node1);
while(head != NULL) {
cout<<head -> val<<" ";
head = head -> next;
}
return 0;
}
代码解释
我们可以通过创建两个指针,一个指向奇数节点,另一个指向偶数节点,然后我们每次移动这两个指针并修改链接指向,直到链表遍历完成。
- 首先需要对链表进行非空判断,如果链表为空、只有一个节点或只有两个节点,则直接返回head节点。
-
赋值两个指针odd和even,odd指向链表的第一个节点,even指向链表的第二个节点。同样这个节点可以通过一个判断来保证链表的正确性。
-
遍历所有偶数节点,将两个链表分离。这里需要注意我们需要循环遍历每个偶数节点,所以对even节点的下一项是否为空进行判断。
-
将odd链表的next指向even链表的next,odd向后移动
-
将even链表的next指向odd链表的next,even向后移动,作用是将偶数链表两两连接。
-
返回head节点。
结论
这里展示了如何将链表中的偶数节点和奇数节点分离,我们可以通过创建两个指针,一个指向奇数节点,另一个指向偶数节点,并使用一个循环来遍历所有的节点。在编写这段代码时,应该对链表进行非空判断,并小心处理两个链表的链接指向。