链表按奇偶索引重排
描述
给定一个链表,需要对链表重新排序,将所有奇数索引节点放在前面,偶数索引节点放在后面,按照要求,第一个节点之后连接的应该是第三个节点,之后是第五个节点,连完所有的奇数索引节点后,再将第二个节点放到奇数节点后,当然,第四个节点是连在第二个节点后面的。
样例
样例11
2输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
样例21
2输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
思路
最简单的思路,遍历节点,轮换添加到奇数索引节点、偶数索引节点的后面,最后进行连接。
遇到的问题:
- 未将最后一个节点的
next
变为NULL
造成死循环 - 访问
NULL -> next
- 将
head->next
作为偶数索引的头节点,实际上head ->next
会因为奇数节点的增加而改变,应该设置另一个变量保存。
第二种思路:设置一个 pOdd
节点代表奇数序列节点的尾节点,设置一个偶数序列的尾节点 oEven
, 每次将偶数的尾节点的后一个节点添加到奇数的尾节点上。
代码
1 | class Solution { |
将题目变一下,按节点的值的奇偶重排:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42class Solution {
private:
public:
ListNode * oddEvenList(ListNode* head) {
if (head == NULL) { return NULL; }
else if (head ->next == NULL) { return head; }
ListNode *q = head->next;
int odd = head->val & 1;
auto prev = head;
while ( q && (head->val + q->val) % 2 ==0 ) {
prev = q;
q = q->next;
}
if (q == NULL) {
return head;
}
ListNode * ptail = prev;
ListNode * qtail = q;
ListNode *next = q->next;
while (next) {
if ((next->val & 1 )== odd) {
ptail->next = next;
ptail = next;
//ptail->next = NULL;
}
else {
qtail->next = next;
qtail = next;
//qtail->next = NULL;
}
next = next->next;
}
ptail->next = q;
qtail ->next= NULL;
return head;
}
};
参考代码
1 | class Solution { |