前端算法-链表重排

简介: 前端算法-链表重排

题目

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

输入: head = [1,2,3,4]
输出: [1,4,2,3]

思路

我们这里可以使用一维数组记录所有链表节点,方便查找所有节点,然后通过数组索引值进行排序,我们先进行判断head参数是否为空,为空直接return,然后声明一个arr数组,用于记录所有的节点,方便查询,然后声明一个变量cur,指向head参数,使用循环对cur变量进行循环,在循环中,将cur的参数使用push方法添加到arr数组中,在将cur的值重新赋值为cur变量的next参数,接下来进行排序,我们这里使用双指针,i变量作为头指针默认值为0,j变量作为为尾指针,默认值为arr数组的最后的下标,接下来继续使用循环,当i变量小于j变量时,循环就会进行,在循环中我们将arr数组中的i++位置的next参数指向了arr数组中的j位置参数,这是将头部指针的next指向了尾部指针,然后在进行判断当前i变量是否不等于j变量,如果是则将arr数组中的j--的next参数指向arr[i],最后在将arr数组中的j变量位的next参数指向null,最后将head参数返回出去

var reorderList = function(head) {
    if(!head) return;
    let arr = []; 
    let cur = head;
    while(cur) {
        arr.push(cur);
        cur = cur.next;
    }
    let i = 0;
    let j = arr.length - 1;
    while(i < j) { 
        arr[i++].next = arr[j];
        if (i !== j){            
            arr[j--].next = arr[i];               
        }        
    }
    arr[j].next = null;
    return head
};


相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
1月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
46 0
|
1月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
44 0
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
32 0
|
1月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
93 0
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
1月前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)
|
1月前
|
算法 索引
经典算法之链表篇
经典算法之链表篇
下一篇
无影云桌面