题目描述
删除有序链表中的重复节点,返回头节点
- 删除掉所有重复节点,例如1->1->2->2->3->4,返回3->4
- 重复的节点中保留一个,例如1->1->2->2->3->4,返回1->2->3->4
删除掉所有重复节点
function ListNode(x){ this.val = x; this.next = null; } function deleteDuplication(pHead){ if(pHead === null || pHead.next === null) return pHead; var H = new ListNode(null); H.next = pHead; var pre = H; var cur = pHead; while(cur !== null && cur.next !== null) { if(cur.next.val === cur.val){ var curRepetitiveVal = cur.val; while(cur !== null && cur.val === curRepetitiveVal) { cur = cur.next; } pre.next = cur; }else{ pre = cur; cur = cur.next; } } return H.next; }
细节
这里面有几个需要注意的细节:
- 新建一个空的头节点,因为这里面牵扯到换新的链表头的问题,所以为了方便新建一个新的节点作为链表的头节点
每个重复节点中保留一个
function ListNode(x){ this.val = x; this.next = null; } function deleteDuplication(pHead){ if(pHead === null || pHead.next === null) return pHead; var H = new ListNode(null); H.next = pHead; var pre = H; var cur = pHead; while(cur !== null && cur.next !== null) { if(cur.next.val === cur.val){ pre = cur; var curRepetitiveVal = cur.val; while(cur !== null && cur.val === curRepetitiveVal) { cur = cur.next; } pre.next = cur; }else{ pre = cur; cur = cur.next; } } return H.next; }
细节
这个和删除掉所有重复节点的区别就是发现有相同的节点时,pre指针立马指向重复的节点中的第一个节点