删除链表倒数第n个节点

 

 

https://leetcode.cn/problems/SLwz0R/

复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    //return twoPoint(head,n)
    return rev(head,n)
    //return revPlus(head,n)
}

//一、计算链表长度

// 1.计算链表长度
// 2.增加一个哑节点,遍历到倒数n+1的位置
func rev(head *ListNode,n int) *ListNode{
    k:=0
    tmp:=head
    now:=&ListNode{
        Next:head,
    }
    for tmp!=nil{
        k++
        tmp=tmp.Next
    }
    cur:=now
    for i:=0;i<k-n;i++{
        cur=cur.Next
    }
    cur.Next=cur.Next.Next
    return now.Next
}

//二、数组定位倒数第n个节点

// 1.存储所有节点
// 2.倒数n+1的节点就是nodes[len(nodes)-1-n]
func revPlus(head *ListNode,n int) *ListNode{
    now:=&ListNode{
        Next:head,
    }
    var nums []*ListNode
    for tmp:=now;tmp!=nil;tmp=tmp.Next{
        nums=append(nums,tmp)
    }
    pre:=nums[len(nums)-1-n]
    pre.Next=pre.Next.Next
    return now.Next
}

//三、双指针

// 1.两个指针,步伐相同
// 2.快指针先移动n步
// 3.两个指针一起移动,直到快指针为nil
// 4.此时慢指针就是倒数n位置

func twoPoint(head *ListNode,n int) *ListNode{
    first:=head
    now:=&ListNode{
        Next:head,
    }
    second:=now
    for i:=0;i<n;i++{
        first=first.Next
    }
    for first!=nil{
        first=first.Next
        second=second.Next
    }
    second.Next=second.Next.Next
    return now.Next
}
复制代码

 

posted @   知道了呀~  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2020-06-29 shell编程--awk 、sed 命令介绍
2020-06-29 shell编程----函数、数组
点击右上角即可分享
微信分享提示