328. 奇偶链表

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/odd-even-linked-list

 1 public class OddEvenLinkedList {
 2     static class ListNode {
 3         int val;
 4         ListNode next;
 5         ListNode(int x) {
 6             val = x;
 7         }
 8     }
 9     public ListNode oddEvenList1(ListNode head) {
10         ListNode cur = head.next;
11         ListNode curOdd = head;
12         while(cur != null && cur.next !=null) {
13             ListNode odd = cur.next;  //新的奇数位结点
14             ListNode next = cur.next.next;  //下一个被操作的偶数位结点
15             ListNode even = curOdd.next;  //当前奇数位后的偶数结点
16             cur.next = next;  //当前偶数位结点指向下一个被操作的偶数位结点
17             curOdd.next = odd;  //当前奇数位结点指向新的奇数位结点
18             odd.next = even;  //新奇数位结点指向当前奇数位后的偶数结点
19             cur = next; //开始新的循环
20             curOdd = odd;
21         }
22         return head;       
23     }    
24     public ListNode oddEvenList2(ListNode head) {
25         if (head == null) {
26             return head;
27         }
28         ListNode odd = head;
29         ListNode even = head.next;
30         ListNode evenHead = even;  //记录第一个偶数位结点
31         while (even != null && even.next != null) {
32             odd.next = odd.next.next;
33             odd = odd.next;
34             even.next = even.next.next;
35             even = even.next;
36         }
37         odd.next = evenHead;  //奇数位结点最后一个结点指向记录的第一个偶数位结点,形成新的链表
38         return head;
39     }
40 
41 }
无论有多困难,都坚强的抬头挺胸,人生是一场醒悟,不要昨天,不要明天,只要今天。不一样的你我,不一样的心态,不一样的人生,顺其自然吧
原文地址:https://www.cnblogs.com/xiyangchen/p/11061597.html