题目搬运
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
思路讲解
这是一道简单的链表题目,题目中所有链表元素是升序排列的,所以相同元素必定是相邻的,这样我们用一个指针指向当前节点,判断下一节点与当前节点数据是否一致,一致就把下一节点删掉,即让当前节点的next指向下一节点的next,即cur->next = cur->next->next(注意此时cur是不变的,因为我们还要比较这一节点与后面的是否相等),然后比较当前节点与后面的节点是否一致,不一致就把当前节点设置为下一节点,循环比较。循环退出的条件有两个,一个是当前节点为空,另一个是当前节点的下一节点为空,若为空则说明判断已经到了尾节点,结束判断。
另外在链表操作的时候,最好全部使用虚拟指针来指向头节点开始算法,这样可以避免链表为空等特殊情况下的很多异常。
另外链表题最好能在纸上画一遍过程,这样会对代码里面每种可能性怎么转移指针有明确的帮助。
代码
// An highlighted block
/**
* 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) {
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* cur = dummy->next;
while(cur&&cur->next){
if(cur->val==cur->next->val){
cur->next = cur->next->next;
}
else
cur = cur->next;
}
return dummy->next;
}
};
备注
第一次写题解,也很久没有写过博客了,以后要坚持下去写题解和技术博客,用来复习和整理,如果博客格式或者题解有错误的地方,望批评指正,共同进步,谢谢~