首页 > 试题广场 >

链表的奇偶重排

[编程题]链表的奇偶重排
  • 热度指数: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,点此查看相关信息
/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
function oddEvenList( head ) {
    let arr=[];
    for(let p=head;p;p=p.next) arr.push(p);
    let i=0,j=1,arr1=[],arr2=[];
    while(arr[i]||arr[j]){
        if(arr[i]) arr1.push(arr[i]);
        if(arr[j]) arr2.push(arr[j]);
        i+=2;
        j+=2;
    }
    arr=arr1.concat(arr2);
    for(let i=0;i<arr.length;i++){
        if(i+1<arr.length) arr[i].next=arr[i+1];
        else arr[i].next=null;
    }
    return arr[0];
}
module.exports = {
    oddEvenList : oddEvenList
};

发表于 2022-11-20 22:19:52 回复(0)

哈哈哈哈,还有谁

 function ListNode(x){
     this.val = x;
     this.next = null;
   }
 
 if(!head)return null
    let cur = head
    ,index = 1
    while(cur){
        if(index%2 ==1){
           cur.flag = true
        }else{
            cur.flag = false
        }
        cur = cur.next
        index++
    }
    
    let arr1 = []
    ,arr2 = []
    cur = head
    while(cur){
        if(cur.flag){
            arr1.push(cur.val)
        }else{
            arr2.push(cur.val)
        }
        cur = cur.next
    }
    arr1.push(...arr2)
    let pHead = new ListNode(arr1[0])
    cur = pHead
    for(let i=1;i<arr1.length;i++){
        cur.next = new ListNode(arr1[i])
        cur = cur.next
    }
    return pHead
    
 
发表于 2022-08-08 17:17:53 回复(0)
function oddEvenList( head ) {
    // write code here
   let oddDummy = {next: null},  evenDummy = {next: null}, odd = oddDummy, even = evenDummy, count = 0, temp = null;
    while (head) {
        temp = head;
        if (count++ % 2 == 0) {
            // odd
            odd.next = head;
            odd = odd.next;
        } else {
            // even
            even.next = head;
            even = even.next;
        }
        head = head.next;
        temp.next = null;
    }
    odd.next = evenDummy.next;
    return oddDummy.next;
}
发表于 2022-05-25 08:01:24 回复(0)
双指针
function oddEvenList( head ) {
    // write code here
    if(!head) return head
    let odd = head       ///扫描奇链节点
    let even = head.next  ///扫描偶链节点
    let evenHead = even    //保存偶数链的节点
    while(even&&even.next){
        odd.next = odd.next.next //指向下一个奇数节点
        even.next = even.next.next //指向下一个奇数节点
        odd = odd.next  //odd推进到下一个奇数节点
        even = even.next //even推进到下一个偶数节点
    }
    odd.next = evenHead //奇数链连上偶数链
    return head
}

发表于 2020-12-17 16:32:43 回复(2)