存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
思路:最直接的思路的话,因为链表是按照顺序排列的,所以我们可以依次比较相邻的两个元素的值。相等的话就可以跳过一个元素,把下一指针结点直接指向下下个元素。依次直至链表为空。
需要引入一个辅助的指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head) return NULL;
ListNode* zhi = head;
while(zhi->next){
if(zhi->val == zhi->next->val) zhi->next = zhi->next->next;
else zhi = zhi->next;
}
return head;
}
};
递归解法如下,妙啊~
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
head.next = deleteDuplicates(head.next);
if(head.val == head.next.val) head = head.next;
return head;
}
}