奇偶链表
题目描述
- 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
- 请尝试使用原地算法完成。你的算法的空间复杂度应为 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 版权协议,转载请附上原文出处链接和本声明。