【两数相加】【打卡第149道】: leetcode 328. 奇偶链表

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;
    }
}

Guess you like

Origin blog.csdn.net/Sunshineoe/article/details/121857297