题目
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
分析
我们可以用俩个指针永远指向最新的奇数和偶数,不断把偶数后面的奇数插入到奇数后面,然后更新分别指向奇数和偶数的指针
public class LinkNode {
int val;
LinkNode next;
public LinkNode(int data) {
this.val = data;
this.next = null;
}
}
public class LinkList {
LinkNode head;
public LinkList() {
this.head = null;
}
public LinkNode getHead() {
return this.head;
}
//添加元素
public void addNode(int data) {
LinkNode node = new LinkNode(data);
if (this.head == null) {
this.head = node;
} else {
LinkNode cur = this.head;
while(cur.next != null) {
cur = cur.next;
}
cur.next = node;
}
}
//正序打印
public void print(LinkNode node) {
while(node != null) {
System.out.print(node.val);
System.out.print(" ");
node = node.next;
}
System.out.println();
}
public void oddEvenList() {
LinkNode p =this.head;
if(p == null) {
return;
}
LinkNode pre = this.head;
LinkNode cur = this.head.next;
while(cur != null && cur.next != null) {
LinkNode next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
pre = pre.next;
cur = cur.next;
}
print(this.head);
}
}
public class oddEvenLinkedList {
public static void main(String[] args) {
LinkList list = new LinkList();
list.addNode(2);
list.addNode(1);
list.addNode(3);
list.addNode(5);
list.addNode(6);
list.addNode(4);
list.addNode(7);
list.oddEvenList();
}
}