样例
给出 1->1->2->null
,返回 1->2->null
给出 1->1->2->3->3->null
,返回 1->2->3->null
方法一:很容易就想到一种递归的算法,从头结点head开始,比较head和后一个节点的大小,如果相等,则把后一个节点删掉。然后继续比较头结点和下一个节点。直到head和下一个节点不相同,递归调用函数,比较下一个节点和其后面节点的值。直到链表尾部。
递归代码如下:
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: head node
*/
ListNode *deleteDuplicates(ListNode *head) {
// write your code here
ListNode *p;
p = head;
if ( head == NULL ) { //如果表为空表,返回NULL
return NULL;
}
while ( p -> next != NULL ) { // 鲁棒性的表现
if ( p ->val == p -> next -> val ) { //如果head的值和下一个节点的值相同
p -> next = p -> next -> next; //将head的下一个节点删除
ListNode *deleteDuplicates(ListNode *head); //继续判断
} else {
p = p -> next; // 如果head和下一个值不想等,指针向后移动,对下一节点进行判断
ListNode *deleteDuplicates(ListNode *p);
}
}
return head;
}
};
代码如下:
ListNode *p,*q;
p = head;
q = head;
if ( head == NULL ) {
return NULL;
}
q = p -> next;
while ( q != NULL ) { //循环判断条件
if ( p -> val == q -> val ) {
q = q -> next;
p -> next = p -> next -> next;
} else {
p = p -> next;
q = q -> next;
}
}
return head;