一个有n个结点的双向循环链表H,随机存放奇数和偶数,试设计一高效算法实现链表节点中奇偶数相邻存放(不要求有序),多余的奇数和偶数放在最后。
时间: 2024-02-13 13:00:20 浏览: 79
可以使用两个指针分别从头尾开始遍历链表,当两个指针指向的节点不符合要求时,交换它们的值。具体做法如下:
1. 定义两个指针 p 和 q,分别指向链表的头和尾。
2. 当 p 和 q 指向的节点都是奇数或者都是偶数时,p 向后移动一位,直到 p 指向一个奇数节点和 q 指向一个偶数节点。
3. 当 p 和 q 指向的节点不符合要求时,交换它们的值,然后 p 向后移动一位,q 向前移动一位。
4. 重复步骤 2 和步骤 3,直到 p 和 q 相遇为止。
最后,p 和 q 相遇的位置就是链表中奇偶数相邻存放的位置。接下来,只需要将 p 之后的所有奇数节点和 q 之前的所有偶数节点交换位置即可。
下面是算法的示意图和Python实现代码:
```
def reorder_list(head):
if not head:
return None
p, q = head, head.prev
while p != q and p.prev != q:
if p.val % 2 == q.val % 2:
p = p.next
else:
p.val, q.val = q.val, p.val
p = p.next
q = q.prev
# 将多余的奇数和偶数节点移到链表尾部
tail = p if p == q else p.prev
while tail.val % 2 == 0:
tail = tail.prev
curr = head
while curr != tail:
if curr.val % 2 == 0:
curr.val, tail.val = tail.val, curr.val
while tail.val % 2 == 0:
tail = tail.prev
curr = curr.next
return head
```
其中,head 表示链表的头节点,每个节点包含三个属性:val 表示节点的值,next 表示指向下一个节点的指针,prev 表示指向上一个节点的指针。函数的返回值是排序后的链表头节点。
阅读全文