问题:
难度medium
把链表下标为基数的节点放到链表前部,链表下标偶数的,放到链表后部。
输入输出案例:
Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL // 1 3 5奇数丢到前部,其余丢到后部
我的代码:
我的算法思想也简单,就是建立一条奇数链,一条偶数链,然后两个奇数在前,偶数在后连起来就是。
用了递归,也可以用循环算法,递归相对来说思考简单,不过全局变量设置较多,而且代码相对较长。
class Solution {
ListNode oddNode;
ListNode evenNode;
ListNode oddTail;
public ListNode oddEvenList(ListNode head) {
if(head != null) {
reverNode(head, 1); // 先拍出奇偶链,下标从1开始
if(oddTail != null) {
oddTail.next = evenNode;
head.next = oddNode;
}
else {
head.next = evenNode;
}
}
return head;
}
public ListNode reverNode(ListNode head, int index) {
if(head.next != null) {
ListNode next = reverNode(head.next, ++ index); // 递归到最后,index也自增
if(index % 2 == 1) { // 奇数就放奇数链,偶数放偶数链
if(oddTail == null) oddTail = next;
next.next = oddNode;
oddNode = next;
} else {
next.next = evenNode;
evenNode = next;
}
}
return head;
}
}
其他代码:
再简洁点就是用指针思想,并且是使用循环
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head==null || head.next==null || head.next.next==null){
return head;
}
ListNode dummyOdd = head;
ListNode dummyEven = head.next;
ListNode headEven=dummyEven; // 记录偶数节点头部
while(dummyEven!=null && dummyEven.next!=null){
// 1、这里和3是相似,odd下一个是even下一个
dummyOdd.next=dummyEven.next;
// 然后跳到下一个奇数节点
dummyOdd=dummyEven.next;
// 2、如果奇数节点下一个为null,偶数就指向null
if(dummyOdd.next==null){
dummyEven.next=null;
} else {
// 3、这里和1是相似,even下一个是odd下一个,判空再while那里
dummyEven.next=dummyOdd.next;
dummyEven=dummyEven.next;
}
}
dummyOdd.next=headEven; // 最后合并就是
return head;
}
}