题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如:1->2->3->3->4->4->5处理后为1->2->5
链表的定义
1 | //链表的定义 |
PS:本文主要的解法以非递归解法为主,一切可以以递归解的题目都可以变成非递归解法。
递归代码(加注释)
1 | package nowcoder; |
通过截图
PS:递归解法的题目都是需要你自己弄懂他的过程,就好比我当初学习递归的第一个例子就是汉诺塔,我也很懵逼,这究竟是什么东西!!!然后花了一个晚上在图书馆一直看课本上的例子和代码,然后就会恍然大悟,原来递归就是这样的。所以递归的思路我水平有限,不知道怎么解释,希望你们自己好好弄懂。
非递归思路
- 首先new一个头节点初始化为0,防止第一个结点和第二个结点相同的情况
- 设置pre和last指针,pre指针指向当前确定不重复的结点,last指针就一直向后搜索
代码(加注释)
1 | package nowcoder; |
通过截图
复杂度分析
- 时间复杂度:O(N)。遍历一遍就可以删除重复结点
- 空间复杂度:O(1)。因为整个过程利用有限的几个变量pre和last,所以空间复杂度为O(1)