奇偶链表
/* 328. 奇偶链表
* 题目描述:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。
* 请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
* 要求:空间复杂度O(1),时间复杂度O(n)
* 解题思路:声明指针记录第二个结点,游标遍历链表,将每个结点的后继指向后继的后继,
* 将游标最后指向的结点的后继指向第二个结点
* 测试:null,只有一个结点、只有两个结点、有若干结点、链表长为奇数或偶数、链表成环(但不考虑)
* 此题需要注意结点个数的奇偶性,若为奇数将第尾结点指向Second若为偶数将倒数第二个结点指向second
* 申请abs指针指向头结点,在倒数第二个结点处停下,判断结点个数为奇偶,进而
* 判断使用那个指针指向second
* */
public class OddEvenLinkedList {
public static void main(String[] args) {
OddEvenLinkedListSolution solution = new OddEvenLinkedListSolution();
//1->2->3->4->5->NULL
ListNode head = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
ListNode node5 = new ListNode(6);
// head.next=node1;
// node1.next=node2;
// node2.next=node3;
// node3.next=node4;
// node4.next=node5;
solution.oddEvenList(head);
ListNode node = head;
while(node!=null) {
System.out.print(node.val);
node = node.next;
}
}
}
class OddEvenLinkedListSolution {
public ListNode oddEvenList(ListNode head) {
if(head==null) return head;
//虚拟结点
ListNode abstractNode=head;
//游标
ListNode p=head;
ListNode secondNode = head.next;
ListNode temp = null;
//结点计数器
int length = 1;
while(p.next!=null) {
length++;
temp = p;
if(abstractNode.next.next!=null)abstractNode = abstractNode.next;
p=p.next;
temp.next=temp.next.next;
}
if(length%2!=0) {
p.next=secondNode;
}
else {
abstractNode.next=secondNode;
}
return head;
}
}