面试题答案
一键面试双向链表节点指针使用
在Go语言实现双向链表时,链表节点结构体中需要包含指向前后节点的指针。以下是一个简单的双向链表节点定义:
type ListNode struct {
Val int
Next *ListNode
Prev *ListNode
}
这里Next
指针指向下一个节点,Prev
指针指向前一个节点,通过这种方式构建双向链表的连接关系。
添加节点操作与内存管理
添加节点到双向链表通常有几种情况,比如在头部添加、尾部添加等。以在头部添加节点为例:
func addToHead(head *ListNode, newNode *ListNode) *ListNode {
if head == nil {
return newNode
}
newNode.Next = head
head.Prev = newNode
return newNode
}
在这个操作中,Go语言的内存管理机制通过垃圾回收(GC)来处理。当创建newNode
时,Go运行时分配内存给它。在连接新节点到链表头部的过程中,只是操作指针来改变链表结构。如果之前的头部节点不再被任何变量引用(例如链表只有一个节点,新节点添加后原节点不再被引用),Go的垃圾回收器会在合适的时机回收该节点占用的内存,从而避免内存泄漏。
删除节点操作与内存管理
删除双向链表中的节点时,要正确调整指针关系。以下是删除指定节点的代码:
func deleteNode(node *ListNode) {
if node.Prev != nil {
node.Prev.Next = node.Next
}
if node.Next != nil {
node.Next.Prev = node.Prev
}
node.Next = nil
node.Prev = nil
}
在删除节点操作中,首先调整前后节点的指针,使它们绕过要删除的节点。然后将被删除节点的Next
和Prev
指针设为nil
,这样该节点就不再与链表相连。当该节点不再被任何变量引用时,Go的垃圾回收器会回收其占用的内存,防止内存泄漏。
通过上述方式,在Go语言实现双向链表的添加、删除节点操作中,合理利用指针操作和Go的垃圾回收机制,能够有效确保没有内存泄漏发生。