📅  最后修改于: 2023-12-03 14:56:19.517000             🧑  作者: Mango
此程序实现的功能是对给定的链表进行分离,将其中所有奇数节点移动到链表前端,偶数节点移动到链表后端。
定义两个指针,分别指向链表的前端和后端,以及一个临时指针用于遍历链表。
初始化前后指针:
struct ListNode *evenHead = head->next;
struct ListNode *oddHead = head;
这一步的目的是让 evenHead 指向链表中第一个偶数节点,oddHead 指向链表中第一个奇数节点。
遍历链表,将所有奇数节点插入到 oddHead 后面,偶数节点插入到 evenHead 后面:
while (temp) {
if (temp->val % 2 == 0) {
evenHead->next = temp;
evenHead = evenHead->next;
} else {
oddHead->next = temp;
oddHead = oddHead->next;
}
temp = temp->next;
}
将最后一个节点的 next 指针置为 NULL:
evenHead->next = NULL;
oddHead->next = head->next;
这一步的目的是让 evenHead 和 oddHead 对应的指针指向链表的最后一个节点,并将链表的尾节点的 next 指针置为 NULL。
struct ListNode* oddEvenList(struct ListNode* head){
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *evenHead = head->next;
struct ListNode *oddHead = head;
struct ListNode *temp = head->next->next;
while (temp) {
if (temp->val % 2 == 0) {
evenHead->next = temp;
evenHead = evenHead->next;
} else {
oddHead->next = temp;
oddHead = oddHead->next;
}
temp = temp->next;
}
evenHead->next = NULL;
oddHead->next = head->next;
return head;
}
此程序实现了对链表的简单操作,即将链表中的奇数节点和偶数节点分别移动到链表的前端和后端。需要注意的是,遍历链表时需要用一个临时指针来遍历整个链表,而且最后一定要将链表的尾节点的 next 指针置为 NULL,否则可能会出现链表出错的情况。