问题描述:
给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点。 请注意,我们正在谈论节点号而不是节点中的值。
解题思路:
题目要求将节点分奇数和偶数组合,而奇数和偶数正好是交替的,所以可以考虑声明两个指针p1和p2,分别指向链表的第一、二个节点。遍历这个链表,每次都将p1->next更新为p2->next,这样就使得p1指向了原本的next的next,然后更新p1为p2,p2继续指向表内的下一个节点。遍历到表末,p1指向倒数第二个节点,p2指向倒数第一个节点,将这两个指针的下一个节点置空,这样就形成了两个链表。最后,我们需要做的就是将偶列连接到奇列后面。遍历奇列,找到指向奇列的最后一个节点的指令,并将它的next置为偶列的第一个节点。
源代码如下:
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
ListNode* odd = head;
ListNode* p1 = head;
ListNode* even = head->next;
ListNode* p2 = head->next;
while(p2->next != NULL)
{
p1->next = p2->next;
p1 = p2;
p2 = p2->next;
}
p1->next = NULL;
p2->next = NULL;
ListNode* p = odd;
while(p->next != NULL)
p = p ->next;
p->next = even;
return odd;
}
};
public:
ListNode* oddEvenList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
ListNode* odd = head;
ListNode* p1 = head;
ListNode* even = head->next;
ListNode* p2 = head->next;
while(p2->next != NULL)
{
p1->next = p2->next;
p1 = p2;
p2 = p2->next;
}
p1->next = NULL;
p2->next = NULL;
ListNode* p = odd;
while(p->next != NULL)
p = p ->next;
p->next = even;
return odd;
}
};