首页 > 试题广场 >

链表的奇偶重排

[编程题]链表的奇偶重排
  • 热度指数:101459 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。

数据范围:节点数量满足 ,节点中的值都满足
要求:空间复杂度 ,时间复杂度
示例1

输入

{1,2,3,4,5,6}

输出

{1,3,5,2,4,6}

说明

1->2->3->4->5->6->NULL
重排后为
1->3->5->2->4->6->NULL
示例2

输入

{1,4,6,3,7}

输出

{1,6,7,4,3}

说明

1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3

备注:
链表长度不大于200000。每个数范围均在int内。

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @return ListNode类
#
class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        # write code here
        if head is None:
            return None
        ji = []
        ou = []
        count = 1
        while head:
            if count  %2==1:
                ji.append(head.val)
                head = head.next
                count += 1
            else:
                ou.append(head.val)
                head = head.next
                count+=1
        
        for i in ou:
            ji.append(i)
        res = ListNode(0)
        temp = res
        for i in ji :
            temp. next = ListNode(i)
            temp = temp.next
        return res.next









发表于 2024-03-05 10:16:11 回复(0)
#对于不会双指针的小白,可以记记链表列表相互转换的代码,缺点就是运行稍慢
class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        #链表转列表
        result = []
        while head:
            result.append(head.val)
            head = head.next
        #奇数偶数分开
        a = []
        b = []
        for i in range(len(result)):
            if i % 2 == 1:
                a.append((result[i]))
            elif i % 2 == 0:
                b.append((result[i]))
        c = b + a
        print(c)
        #列表转链表
        if not c:
            return None
        head = ListNode(c[0])
        r = head
        for value in c[1:]:
            r.next = ListNode(value)
            r = r.next
        return head

发表于 2024-01-27 11:46:43 回复(0)
class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        # write code here
        p1 = ListNode(0)
        p2 = ListNode(0)
        even = p1
        odd = p2
        next = None  # 记录下一个head节点
        while head != None and head.next != None:
            # 处理奇数节点
            next = head.next
            # 断开head节点
            head.next = None
            p1.next = head
            head = next
            # 处理偶数节点
            next = head.next
            head.next = None
            p2.next = head
            head = next
            # 指针指向next节点 
            p1 = p1.next
            p2 = p2.next
        if head != None:
            p1.next = head
            p1 = p1.next
        # 连接
        p1.next = odd.next
        return even.next

发表于 2023-08-17 15:06:43 回复(0)
class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        # write code here
        odd_head = ListNode(0)
        even_head = ListNode(0)
        p_odd = odd_head
        p_even = even_head
        flag = True
        p = head
        while p:
            if flag:
                p_odd.next = p
                p_odd = p
            else:
                p_even.next = p
                p_even = p
            p = p.next
            flag = not flag
        p_odd.next = even_head.next
        p_even.next = None
        return odd_head.next
        


发表于 2023-07-20 23:05:18 回复(0)

算法小白,想请教一下,面对链表可以转化成列表处理然后再转化为链表嘛?

class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        # write code here
        nums = []
        pre = head
        while pre:
            nums.append(pre.val)
            pre = pre.next

        nums_sorted = nums[0::2] + nums[1::2] # 按照要求将奇数位排在前面,偶数位排在后面

        pre = head
        for i in nums_sorted:
            pre.val = i
            pre = pre.next
        return head
发表于 2022-12-30 03:30:47 回复(1)
就是指针的调换,now指针中间会隔一个

class Solution:
    def oddEvenList(selfhead: ListNode) -> ListNode:
        # write code here
        if head == None:
            return None
        ji = head
        ou = head.next
 
        if head.next == None:
            return head
        now = head.next
        while now and now.next:
            ji.next = now.next
            ji = ji.next
            now.next = ji.next
            now = now.next
        ji.next = ou
        return head
            
发表于 2022-10-19 17:48:19 回复(0)
class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        # write code here
        evenHead = head.next # 偶数的第一个
        odd = head # 奇数
        even = head.next # 偶数
        while even and even.next:
            odd.next = even.next # 奇数指向奇数
            odd = odd.next
            even.next = odd.next # 偶数指向偶数
            even = even.next
        odd.next = evenHead # 奇数最后一个指向偶数第一个
        return head
发表于 2022-04-25 23:04:51 回复(2)

问题信息

上传者:牛客332641号
难度:
8条回答 7219浏览

热门推荐

通过挑战的用户

查看代码