# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
#way1
if not head:
return head
odd = head
even = p = head.next
while odd.next and p.next:
odd.next = odd.next.next
p.next = p.next.next
odd, p = odd.next, p.next
odd.next = even
print(head)
return head
#way2
if not head:
return head
odd = head.next
even = head
#p1,p2分别为奇和偶节点的游标
p1,p2 = even,odd
#如果奇和奇节点的下个节点为空 说明遍历结束,因为总是奇和偶节点是相邻的
while p2 and p2.next:
p1.next = p1.next.next
p2.next = p2.next.next
p1 = p1.next
p2 = p2.next
print(even)
print(odd)
p1.next = odd
return p1
从代码的角度来看,way1的耗时更短一些。
- 这个题目要求下标奇数的放在一下,下标偶数的放在一起,因此用双指针就是比较方便的
- odd为奇指针,用head.next表示;even为偶指针用head来表示
- 遍历整个链表,将下标是奇数的指针都指向以odd开头的指针,下标是奇数的指针都指向以even指向的指针
- 然后将奇数的链表链在偶数链表的后面
- 就完成了该操作
总结:本题主要考察了双指针的用法,在链表的问题中常常还需要使用双指针(快慢指针)去找到中间节点等任务。