算法:删除链表的倒数第 N 个结点 go实现

package main

import "fmt"

/*
删除链表的倒数第 N 个结点
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
*/

/*
首先从头节点开始对链表进行一次遍历,得到链表的长度 LL。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1L−n+1 个节点时,它就是我们需要删除的节点。
时间复杂度:O(L),其中 LL 是链表的长度。
空间复杂度:O(1)。
*/

type NodeR struct {
	data interface{} //数据域
	next *NodeR       //指针域
}
type ListNode struct {
	length   int //储存链表的长度
	headNode *NodeR
}

/*单链表的初始化
1、生成新结点作为头结点,用头指针指向头结点
2、头结点的指针域置空
*/
func InitListR() *ListNode {
	//即构造一个空的单链表L(包含头指针)
	nodeR := new(NodeR)
	L := new(ListNode)
	L.headNode = nodeR
	return L
}
func getLength(head *NodeR) (length int) {
	for ; head != nil; head = head.next {
		length++
	}
	return
}

func removeNthFromEnd(head *NodeR, n int) *NodeR {
	length := getLength(head)
	dummy := &NodeR{0, head}
	cur := dummy
	for i := 0; i < length-n; i++ {
		cur = cur.next
	}
	cur.next = cur.next.next
	return dummy.next
}
//从头部插入
//func (list *ListNode) AddElem(v interface{}) {
//	node := &NodeR{data: v}
//	node.next = list.headNode
//	list.headNode = node
//	list.length++
//	return
//}

/*
判断好从头还是从尾,有些是无所谓,只要创建链表就好,但是这个是需要返回值的不可以那样
这一题要从尾部插入,不能用头部插入
尾部插入函数
*/

func (list *ListNode) AppendElem(v interface{}) {
	node := &NodeR{data: v}
	cur := list.headNode
	for cur.next != nil {
		cur = cur.next
	}
	cur.next = node
	list.length++
	return
}
func printlist(la *NodeR){
	for {
		if la.next == nil{
			break
		}
		fmt.Print(la.next.data)
		la = la.next
	}
}
func main()  {
	La :=InitListR()
	test := []int{1,2,3,4,5,6}
	for i :=range test{
		La.AppendElem(test[i])
	}
	ra :=removeNthFromEnd(La.headNode,3)
	printlist(ra)
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值