这题开始之前先来介绍一下Linked list(连结串列)的资料结构。
Linked list(连结串列)使用node(节点)来记录、表示、储存资料(data),并利用每个node中的pointer指向下一个node,来将多个node串起来。并以null 来代表Linked list的终点。
Node的结构如题目定义:
function ListNode(val, next) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}
今天题目的目标是要把Linked list中node的数字重复者都移除掉,并回传移除後的结果,且题目有说这个Linked list是已经由小到大排序好的了,回传时也要是排序好的。
这题相较简单是因为题目给我们的Linked list是已经排序过的,今天如果没有排序过我们就需要用到之前提过的hashTable来储存已经拜访过的值,遇到重复的数再来调整pointer。
回到今天的题目。同理上面描述的这种方式当然可以套用在我们今天的题目,不过没有必要,因为我们的Linked list是已经排序过的,我们可以省掉额外储存的hashtable
以范例来说
Input: head = [1,1,2,3,3]
Output: [1,2,3]
目前Linked list的形状如下
1 → 1 → 2 → 3 → 3 → null
当我们今天一开始在1的时候
我们用一个temp来储存1的下一个数,也就是tmp = 1 (1.next = 1)
因为1 === 1
我们需要把第二个1拔掉
需要做以下的操作
current = head
// 把1的下下一个数(2)存到tmp
tmp = current.next.next
// 把1的下一个数换成tmp
current.next = tmp
也就是说,我们只要一个loop,把这个Linked list走过,遇到next和现在一样,我们就仿造以上做法。如果有多个重复,我们可以利用while来实作,直到下个不同的node才去调整pointer
整体时间复杂度为:O(n),空间复杂度为:O(1)
var deleteDuplicates = function (head) {
let current = head;
while (current !== null) {
let nextDifferent = current.next;
while (nextDifferent !== null && nextDifferent.val === current.val) {
nextDifferent = nextDifferent.next;
}
current.next = nextDifferent;
current = nextDifferent
}
return head;
};
看完上述的做法,不要忘记做做看如果Input Linked list没有sort的情况喔!
明日题目预告:挑战一下 Remove Nth Node From End of List(Medium)
<<: Day 16 - 依 NEWS 前台页面分析拆解後,逐步建立後台功能 (上) - Calendar 日历功能应用 - ASP.NET Web Forms C#
>>: Ascii - 产生 3D 旋转甜甜圈的甜甜圈形 C 程序码参考笔记
前一篇有提到 Provider 与 Module 之间有很核心的机制,该机制使用了 依赖注入 的概念...
EventChannel EventChannel:用於接收一系列讯息,这些讯息被包装到 Strea...
任一脚本都可使用此函式 本次范例加在Photo脚本里 public void OpenURL() {...
当我们一直需要重复使用某些功能的时候,可以将程序码打包成一个模组,而有些好心人士将自己写好的多个模组...
读取指定储存泛范围的资料 建立get_rows()函式读取指定范围的资料 iter_rows()取出...