描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
public class OddEvenList {
static class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public static ListNode oddEvenList2 (ListNode head) {
//如果链表为空,不用重排
if(head == null)
return head;
//even开头指向第二个节点,可能为空
ListNode even = head.next;
//odd开头指向第一个节点
ListNode odd = head;
//指向even开头
ListNode evenhead = even;
while(even != null && even.next != null){
//odd连接even的后一个,即奇数位
odd.next = even.next;
//odd进入后一个奇数位
odd = odd.next;
//even连接后一个奇数的后一位,即偶数位
even.next = odd.next;
//even进入后一个偶数位
even = even.next;
}
//even整体接在odd后面
odd.next = evenhead;
return head;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public static ListNode oddEvenList (ListNode head) {
ListNode oddList = head; // 奇数
ListNode evenList; // 偶数
if(null == head){
return null;
}
evenList = oddList.next; // 奇数的下一个是偶数
ListNode tmpOddNode = oddList;
ListNode tmpEvenNode = evenList;
ListNode evenhead = tmpEvenNode;
// 2 1 3 5 6 4 7
while(tmpEvenNode != null && tmpEvenNode.next != null){
tmpOddNode.next = tmpEvenNode.next;
tmpOddNode = tmpOddNode.next;
tmpEvenNode.next = tmpOddNode.next;
tmpEvenNode = tmpEvenNode.next;
}
tmpOddNode.next = evenhead;
return oddList;
}
public static void main(String[] args) {
// 2 1 3 5 6 4 7
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(1);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(6);
ListNode l6 = new ListNode(4);
ListNode l7 = new ListNode(7);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
l5.next = l6;
l6.next = l7;
ListNode t = oddEvenList(l1);
System.out.println(t);
}
}