【面试题】从链表尾部算起,删除第n个节点

polaris · 2017-10-10 02:31:22 · 2878 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-10-10 02:31:22 的主题,其中的信息可能已经有所发展或是发生改变。

给定一个链表,从链表尾部算起,删除第n个节点,并返回链表头节点。

例如:

给定列表:1->2->3->4->5,和 n = 2。
从尾部算起,删除第2个节点后,链表变为:1->2->3->5。

说明:

  1. 给出的 n 总是有效的,比如不会出现负数。
  2. 尽可能使用 O(n) 算法实现。

Go 示例定义:

/**
 * 定义一个单链表:
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {

}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2878 次点击  
加入收藏 微博
4 回复  |  直到 2017-10-10 07:34:49
wenjiax
wenjiax · #1 · 7年之前
type ListNode struct {
    Val  int
    Next *ListNode
}

func removeNthFromEnd(head *ListNode, n int) *ListNode {
    if head != nil {
        // 获取长度
        var hLen int
        for l := head; l != nil; l = l.Next {
            hLen++
        }
        // 计算删除位置
        n = hLen - n + 1
        front := head
        now := head.Next
        for i := 2; i < n && now.Next != nil; i++ {
            front = now
            now = front.Next
        }
        front.Next = now.Next
        now = nil
        return head
    }
    return nil
}
freboat
freboat · #2 · 7年之前

应该考虑只用一次循环来实现

用一个指针p保留当前节点i的前面n节点

每次迭代,p,i都叠加

当i是末尾时,删除p

calrer_czj
calrer_czj · #3 · 7年之前

单链表

func removeNthFromEnd(head *NodeList, n int) *NodeList {

    if head == nil{
        return nil
    }

    if n < 0 {
        return head
    }

    i, j := head, head  
    z := 0

    for ; i.Next != nil; i=i.Next{
        if z < n+ 1 {
            z++
            continue
        }
        j = j.Next
    }

    if(z > n){
        j.Next = j.Next.Next
    }

    return head;
}
Sergey
Sergey · #4 · 7年之前
freboatfreboat #2 回复

应该考虑只用一次循环来实现 用一个指针p保留当前节点i的前面n节点 每次迭代,p,i都叠加 当i是末尾时,删除p

正解

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传