常见前端算法题二----链表

常见前端算法题二----链表,第1张

1.反转链表

示例:

输入:1->2->3->4->null
输出:4->3->2->1->null

解题思路:将单链表中的每一个节点的后继指针指向它的前驱节点即可。


确定边界条件:当链表为null或链表中仅有一个节点时,不需要反转

var resverList =function(head){
    if(!head || !head.next) return head
    let prev=null
    let current=head
    while(current){
        // 用来临时存储current后继节点
        var next=current.next 
         //反转指针
        current.next=prev  
        // 更新prev,current
        // 待反转节点指向下一个节点
        prev=current  
        current=next  

    }
    head=prev
    return head
}
2.求链表的中间节点

示例:给定一个带有头节点head的非空链表,返回中间节点。


如果有两个中间节点,则返回第二个中间节点

解题思路:快慢指针法,慢指针走一步,快指针走两步,当快指针走到终点时,慢指针刚好指向中间节点

var midleNode =function(head){
    let fast =head
    let slot =head
    while(fast&&fast.next){
        slot=slot.next
        fast=fast.next.next
    }
    return slot
}
3.删除链表倒数第n个节点

解题思路:同样也是快慢指针,只不过快指针提前走n+1步,还得判断一种特殊情况,就是n是不是和链表的长度相等

var removeList=function(head,n){
    let fast=head;
    let slot=head;
    while(--n){
        fast=fast.next; //先走n步
    }
    // 判断链表的长度是不是n,如果刚好走了n步,没有下一个节点,就删除第一个节点并返回
    if(!fast.next)return head.next
    // 如果不是,快指针就再走一步,比慢指针提前走n+1步
    fast=fast.next
    // 快慢指针一起前进
    while(fast&&fast.next){
        fast=fast.next
        slot=slot.next
    }
    slot.next=slot.next.next
    return head

}
4.合并两个有序链表

示例:将两个升序链表合并为一个新的有序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成

解题思路:递归实现

function mergeList(l1,l2){
    if(l1==null)return l2
    if(l2==null)return l1
    if(l1.val<=l2.val){
        l1.next=mergeList(l1.next,l2)
        return l1
    }else{
        l2.next=mergeList(l2.next,l1)
        return l2
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/579863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存