328. Odd Even Linked List

本文介绍了一种将单链表中奇数位置的节点与偶数位置的节点进行分离的方法,并提供了两种不同的实现策略。第一种方法通过两次遍历来完成,而第二种方法则仅需一次遍历。重点在于实现过程的细节和效率优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

单链表位于奇数位置的统一放在前面,位于偶数位置的统一放在后面

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.

You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.

Example:
Given 1->2->3->4->5->NULL,
return 1->3->5->2->4->NULL.

思路:

  1. 一个很傻的想法:扫描一遍,找到链表的长度和链表的tail。再扫描一遍,把偶数的挂在tail后面即可
  2. 一个比较不傻的想法:只循环一遍。保存下第一个偶节点的位置。分别用两个指针,一个指向第一个节点,一个指向第二个节点,移动的过程中把奇偶俩条链子连接好,直到这两个指针中有一个的next为空(思考一下,无论是哪一个指针这时的next为空,偶数链条最后一个的next都为空)。最后把两条链接起来。
程序
第一种的程序
public class Solution {
    public ListNode oddEvenList(ListNode head) {
    	if(head == null) return null;
    	if(head.next == null) return head;
    	ListNode tail = head;
    	int count = 1;
    	while(tail.next != null) {
    		tail = tail.next;
    		count++;
    	}
    	ListNode h = head;
    	for(int i = 0; i < count/2; i++) {
    		ListNode tmp = h.next;
    		tail.next = tmp;
    		h.next = tmp.next;
    		tail = tail.next;
    		h = h.next;
    	}
    	tail.next = null;
    	return head;
    }
}



第二种的程序
public class Solution {
    public ListNode oddEvenList(ListNode head) {
    	if(head == null || head.next == null ) return head;
    	ListNode oddhead = head;
    	ListNode sevenhead = head.next;
		ListNode evenhead = head.next;
    	while(oddhead.next != null && evenhead.next != null) {
    		oddhead.next = oddhead.next.next;
    		oddhead = oddhead.next;
    		evenhead.next = evenhead.next.next;
    		evenhead = evenhead.next;
    	}
    	oddhead.next = sevenhead;
    	return head;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值