描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
示例1
输入:
{1,2,3,4,5,6}
返回值:
{1,3,5,2,4,6}
说明:
1->2->3->4->5->6->NULL
重排后为
1->3->5->2->4->6->NULL
示例2
输入:
{1,4,6,3,7}
返回值:
{1,6,7,4,3}
说明:
1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数节点有1,6,7,偶数节点有4,3。重排后为1,6,7,4,3
备注:
链表长度不大于200000。每个数范围均在int内。
初试牛客 的在线编程
思路
通过2个指针来维护奇偶两个链表,一个指针用于最后拼接奇偶链表。
代码
import java.util.*;
/*
* public class ListNode { //节点类
* int val;
* ListNode next = null;
* public ListNode(int val) { //有参构造
* this.val = val;
* }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
//边界条件, 头结点为空,或者头结点的下一个节点为空。
if (head == null || head.next == null) {
return head;
}
//偶数
ListNode evenHead = head.next;
ListNode odd = head, even = evenHead;
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;
}
}
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
//偶数链表表头从head的下一个开始
ListNode evenHead = head.next;
//奇数链表表头从head开始
ListNode odd = head, even = evenHead;
//当偶数链表不为空且偶数链表的下一个数不为空时进入循环
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;
}
}