文章目录
面试题 02.01. 移除重复节点
原题链接:面试题 02.01. 移除重复节点
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var removeDuplicateNodes = function(head) {
};
解题思路:
①哈希表法
- 利用哈希表依次存储结点
- 用set.has()方法判断是否重复,如果重复通过指向进行删除,并后移
- 不重复则通过set.add()存储,并后移
var removeDuplicateNodes = function(head) {
//利用哈希
if(head==null){
return head;
}
var set=new Set();
set.add(head.val);
var prev=head; //head赋给prev
var curr=head.next; //head.next赋给curr
while(curr!=null){
if(set.has(curr.val)){
//如果当前结点重复
prev.next=curr.next; //让prev的next指向curr的next 进行删除
curr=curr.next; //curr后移
}else{
set.add(curr.val); //第一次出现 ,存储到set里
prev=prev.next; //prev和curr均后移
curr=curr.next;
}
}
return head;
};
②利用双指针法
- 声明p、q指针,分别指向head和p
- 将p指针的位置先固定,不断移动q指针进行扫描与p的值比较,相同则删除 ,否则q指向后移
- 一轮循环完后,让p向后移,判断下一个结点
- 时间复杂度较高,执行效率慢
var removeDuplicateNodes = function(head) {
//双指针
var p=head;
while(p!=null){
var q=p; //将p指针赋给q
while(q.next!=null){
if(q.next.val==p.val){
//如果后面的q有和固定的p有重复
q.next=q.next.next; //删除重复
}else{
q=q.next;
}
}
p=p.next; //让p向后移,判断下一个结点
}
return head;
};
83. 删除排序链表中的重复元素
原题链接:83. 删除排序链表中的重复元素
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function (head) {
};
解题思路:
注意: 与上题的不同点在于,该链表已经按升序排列,所以重复元素一定相邻,比无序排列的链表删除重复元素简单
- 让p指针指向head 并且判断p的val和p.next.val是否相等
- 如果相等则为重复并删除 , 否则,p指针指向下一个元素
var deleteDuplicates