题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Return the linked list sorted as well.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
解答:
这道题稍微画图就不难求解。思路如下:
- 先建立假节点 newhead 指向表头,建立指针 node 从假节点开始遍历
- 向后遍历链表,用 temp 记录下后继第一个节点的值,便于后面判断。只要node.next.val == temp,就不断改变node的next域,这样做可以保证前驱一直指向重复节点的头,并将重复节点整体删除
- 若节点的值不重复,则后移node
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode newhead = new ListNode(0);
newhead.next = head;
ListNode node = newhead;
while(node.next != null && node.next.next !=null) {
if(node.next.val == node.next.next.val) {
int temp = node.next.val;
while(node.next != null && node.next.val == temp) {
node.next = node.next.next;
}
} else {
node = node.next;
}
}
return newhead.next;
}
}
看到了更多人的另一种解法,整体思路基本无差,但个人感觉这种写法更难理解一点~
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){
return head;
}
ListNode newhead = new ListNode(-1);
ListNode tmp = newhead;
while(head != null && head.next != null){
if (head.val == head.next.val){ //遇到相同的元素,整段删除
while(head.next != null && head.val == head.next.val){
head = head.next;
}
head = head.next;
}
else{
tmp.next = head;
tmp = tmp.next;
head = head.next;
}
}
tmp.next = head;
return newhead.next;
}
}