Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
删除链表中重复的部分,刚开始的思路就是比较一个节点和下一个节点的数字是否一样,如果不一样的话就将该节点插入到一个新的链表中,相当于遍历一边链表然后将符合规则的链表插入到新的链表中。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* tail = new ListNode(-99999);
ListNode* start = tail;
while(head) {
//下一个节点不为空并且当前节点和下个节点数字不一样 或者 下一个节点为空并且当前节点和新的节点最后一个不一样
if(head->next && head->val != head->next->val || !head->next && head->val != tail->val) {//不相等的话加入新的链表
ListNode* node = new ListNode(0);
node->val = head->val;
//cout << head->val;
tail->next = node;
tail = node;
}
head = head->next;
}
return start->next;
}
};
因为需要重新创建链表的缘故,上述的方法效率并不是很高,新的思路就是用两个指针分别指向一个节点和下一个节点,如果这两个节点相等,咋让这个节点直接指向下下一个节点,否则的话就正常遍历,这样就省去了新建节点的空间。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
/*ListNode* tail = new ListNode(-99999);
ListNode* start = tail;
while(head) {
//下一个节点不为空并且当前节点和下个节点数字不一样 或者 下一个节点为空并且当前节点和新的节点最后一个不一样
if(head->next && head->val != head->next->val || !head->next && head->val != tail->val) {//不相等的话加入新的链表
ListNode* node = new ListNode(0);
node->val = head->val;
//cout << head->val;
tail->next = node;
tail = node;
}
head = head->next;
}
return start->next;*/
if(!head) {
return NULL;
}
ListNode * start = head;
ListNode * tail = head->next;
while(tail) {
if(start->val == tail->val) {
start->next = tail->next;
tail = tail->next;
} else {
start = start->next;
}
}
return head;
}
};
int main() {
Solution s;
ListNode node1(0);
ListNode node2(0);
ListNode node3(0);
ListNode node4(0);
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
ListNode * p = s.deleteDuplicates(&node1);
while(p) {
cout << p->val;
p = p->next;
}
}