给定一个单链表。请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重接后输出。 注意是节点的编号而非节点的数值。 要求:空间复杂度 0(n),时间复杂度0(n) 示例 输入: {1,4,6,3,7} 返回值:java实现
时间: 2024-10-18 18:11:14 浏览: 29
C++删除链表中间节点的方法
5星 · 资源好评率100%
在Java中,你可以通过迭代的方式来解决这个问题。首先,我们需要两个指针,一个快指针每次移动两个位置,另一个慢指针每次移动一个位置。当快指针到达链表末尾时,慢指针的位置就是奇数位置的最后一个节点。然后我们可以创建一个新的链表,同时处理奇数和偶数位置的节点。
```java
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode fast = head.next;
ListNode slow = head;
ListNode oddHead = head;
ListNode evenTail = null;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
ListNode temp = slow.next;
slow.next = null; // 断开偶数部分
if (evenTail != null) {
evenTail.next = temp; // 将偶数部分链接到现有链表
} else {
oddHead.next = temp; // 如果这是第一个偶数节点,则连接到奇数头
}
evenTail = temp; // 更新偶数尾巴
}
// 如果还有剩余的偶数节点,直接连接到奇数链表的尾部
if (slow != null) {
oddHead.next = slow;
}
return oddHead;
}
```
这个函数的时间复杂度是O(n),因为它只遍历了一次链表。空间复杂度是O(1),因为我们只使用了几个固定大小的额外变量,并未使用与输入链表大小成比例的空间。
阅读全文