每日一题之链表的基本操作

题目:

image-20240714170714455

题目链接:两两交换链表中的节点

题解:

迭代

function ListNode(val, next) {
     this.val = (val===undefined ? 0 : val)
     this.next = (next===undefined ? null : next)
 }
​
let swapPairs = function(head) {
​
    let newNode = new ListNode(0,head)
    let cur = head
    let pre = newNode
    while(cur && cur.next){
        let next = cur.next
        cur.next = next.next
        next.next = cur
        pre.next = next
        
        pre = cur
        cur = cur.next
    }
    return newNode.next
};

递归

如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

let swapPairs = function(head) {
    if (head === null|| head.next === null) {
        return head;
    }
    const newHead = head.next;
    head.next = swapPairs(newHead.next);
    newHead.next = head;
    return newHead;
};
​

删除链表的倒数第N个结点

题目: ​​​​​​​

image-20240714203714045

题目链接:删除链表的倒数第N个结点

题解:

使用双指针,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了

几个关键点:

  • 使用虚拟头结点,这样方便处理删除实际头结点的逻辑

  • fast首先走n + 1步,只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作)

function ListNode(val, next) {
     this.val = (val===undefined ? 0 : val)
     this.next = (next===undefined ? null : next)
 }
​
var removeNthFromEnd = function(head, n) {
    let newNode = new ListNode(1,head)
    let fast = newNode
    let slow = newNode
    for(let i=0;i<=n;i++){
        slow = slow.next
    }
    while(tail !=null){
        fast = fast.next
        slow = slow.next
    }
    fast.next = fast.next.next
​
    return newNode.next
};

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值