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)
}
算法:删除链表的倒数第 N 个结点 go实现
最新推荐文章于 2024-01-03 17:31:00 发布