C#实现IMyList接口时如何访问Node类字段编写方法逻辑
你的核心问题是用了显式接口实现Head属性,导致类内部无法直接访问该属性;而Node的两个字段都是public的,只要拿到Node实例就可以直接读写,不存在访问限制。
显式接口实现的处理
你当前写的Node IMyList.Head { get; set ; }属于显式接口实现,这种实现的属性只能通过IMyList类型的变量访问,类内部直接写this.Head会编译报错。两种修复方案:
- 方案1(推荐):改成隐式实现,直接声明
public Node Head { get; set; },类内外都可以直接访问,写代码更方便 - 方案2:保留显式实现的话,类内部访问时通过
((IMyList)this).Head的方式获取/赋值
完整实现代码
public class MyCustomizedList : IMyList { // 采用隐式实现,简化内部访问 public Node Head { get; set; } public void Add(int elm) { // 初始化新节点,直接给public字段赋值 Node newNode = new Node { Data = elm, Next = null }; // 空链表直接把新节点设为头 if (Head == null) { Head = newNode; return; } // 遍历到链表尾部 Node current = Head; while (current.Next != null) { current = current.Next; } // 尾节点关联新节点 current.Next = newNode; } public void PrintAll() { Node current = Head; while (current != null) { Console.Write(current.Data); if (current.Next != null) { Console.Write(" -> "); } current = current.Next; } Console.WriteLine(); } public void Reverse() { // 三指针原地反转,不依赖任何额外集合/数组,空间复杂度O(1) Node prev = null; Node current = Head; Node nextTemp = null; while (current != null) { nextTemp = current.Next; current.Next = prev; prev = current; current = nextTemp; } // 反转完成后prev就是新的头节点 Head = prev; } }
补充说明
- 上述Add方法默认将元素添加到链表尾部,时间复杂度O(n);如果需要优化性能,可以在类里额外维护一个
Tail尾节点指针,添加时直接操作尾节点,时间复杂度降到O(1) - Reverse方法用的是单链表反转的标准实现,全程只用了3个Node类型的临时变量,完全符合不能用辅助集合/数组的限制
- 因为Node的Data和Next都是public字段,不需要通过属性包装,拿到实例后直接用
.运算符访问即可
内容的提问来源于stack exchange,提问作者Alex Butane
相关产品推荐
相关产品推荐

