奇偶链表

  • Post author:
  • Post category:其他






奇偶链表




题目描述

  • 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
  • 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。



题解(java)

public class Solution {
    public ListNode oddEvenList(ListNode head) {
        //如果链表头结点为null,则该链表为空链表
        //返回null或head都可
        if (head == null) return head;
        //分别定义两个奇偶链表的头结点
        ListNode odd = head, even = head.next, evenHead = even;
        while (odd.next != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        //把偶链表的头结点连接到奇链表的尾部
        odd.next = evenHead;
        //最后返回新的链表
        return head;
    }
}



图示

在这里插入图片描述

在这里插入图片描述



详解

  • 简单来说该题就是将原链表先分为两个奇偶链表,最后再将偶链表的头部连接到奇链表的尾部。
  • 1>.解题前先判断该链表是否为空链表
  • 2>.开始遍历【将偶节点的下一个节点连接奇节点后 odd 指针顺移,将奇节点的下一个指针连接到偶节点后 even 指针顺移】当odd 或 even的下一个节点为空时,遍历结束。
  • 3>.遍历结束后将偶链表的头结点(evenHead)连接到奇链表尾部(odd.next)
  • 4>.最后返回新链表的头结点 head.



Tips

  • 注意:这里默认 head 为奇链表的头结点,需定义一个偶链表的头结点 evenHead(head.next).
  • 建议画图理解



声明

  • 原作者:E.L.E
  • < 本文章著作权归作者所有,商业转载请获得原作者允许,非商业转载请注明来处,欢迎大家评论>



版权声明:本文为weixin_48557384原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。