1、题目描述
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
2、算法分析
题目中说将原始链表中的编号为奇数的结点和偶数的结点分开。
头结点是奇数结点,头结点的下一个结点是偶数结点。相邻结点的奇偶数不同。
不防将奇数结点和偶数结点分离成奇数链表和偶数链表。然后将偶数链表连接在奇数链表之后,合并后为结果链表。
定义奇数链表和偶数链表头结点:
ListNode odd = head;
ListNode evenNode = head.next;
ListNode even指向的是偶数编号结点的第一个结点
循环判空条件:
全部节点分离完毕的条件是 even 为空节点或者 even.next 为空节点,所以判断都不为null。
while(even != null && even.next != null)
odd.next = even.next; // 连接奇数编号的结点
even.next = odd.next; // 连接偶数编号的结点
最后返回的还是head;
3、代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null){
return head;
}
// 定义奇偶数的开头结点
// 定义odd指针指向的是head结点
ListNode odd = head;
// 定义evenHead指向的是head.next下一个结点
ListNode evenHead = head.next;
// 定义even指针指向的是evenHead指向的结点
ListNode even = evenHead;
//全部节点分离完毕的条件是 even 为空节点或者 even.next 为空节点
// 所以判断都不为null
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;
}
}