波波老师,感觉自己还是没有彻底理解链表啊,怎么办?
来源:4-5 从链表中删除元素
qq_山上山_0
2019-05-16
Leetcode206反转链表(视频看了但是题目做不出。。99999)
我的C#代码:(执行超时,肉闷啊:)-_-)
List<ListNode> x_List = new List<ListNode>();
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
while (head != null)
{
this.x_List.Add(head);
head = head.next;
}
if (this.x_List.Count <= 0)
return null;
int count = this.x_List.Count;
ListNode listnode = this.x_List[count - 1];
for (int i = count - 1; i > 0; i--)
{
this.x_List[i].next = this.x_List[i - 1];
}
return listnode;
}
别人的代码(整个不理解,知道是颠倒次序,但就是没彻底搞懂; 为什么没有指向next,新的链表竟然成立??)
public ListNode ReverseList(ListNode head)
{
if (head == null)
return null;
ListNode reverse = null;
while (head != null)
{
ListNode tempStore = head.next; // 将 head 的 下一个对象引用临时存储
head.next = reverse;
reverse = head;
head = tempStore;
}
return reverse;
}
1回答
-
这个课程没有讲翻转链表的具体实现。在我的《玩转算法面试》中有详细介绍这个过程。
如果你没有购买那个课程,也可以通过github直接看到源码:
我的建议:
1)先将正确的代码翻译成正确的C#代码;
2)用1个节点,2个节点,3个节点,4个节点的测试用例,去跟踪程序,一步一步看,理解每一步,程序中的变量都是在怎么变化的,是怎么一步一步完成反转链表的过程的。
3)在跟踪的过程中,尤其要去体会,每一个变量的意义是什么,每一个变量在做什么事情。
另外,链表的题目做不出来,不意味着没有理解链表;
就像给你一个数组的题目做不出来,不意味着没有理解数组;
给你一个使用栈的题目做不出来,也不意味着不理解栈。
理解一个数据结构,和能灵活运用这个数据结构解决问题,本来就是两回事儿。这门课程侧重于介绍数据结构的底层实现。印象里在课程中介绍过,我不建议学完一个数据机构,就去Leetcode上刷相关数据结构的问题。很有可能你会长时间被某个“难题”卡住,而丧失了信心。但这其实是没必要的。
我还是建议现针对课程中介绍的数据结构的基本操作进行掌握,之后,再解决灵活使用数据结构的问题。
如果你时间紧,急于应付面试,我推荐直接去学习《玩转算法面试》。(https://coding.imooc.com/class/82.html )
关于我的算法课程的学习顺序,可以参考这里:https://coding.imooc.com/learn/questiondetail/54345.html
加油!:)
032020-01-06
相似问题