剑指offer18.2-AcWing-29. 删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
思路:
首先判断节点是否为空,若是空,则直接return
初始两个变量,一个指向当前节点nowNode,一个指向当前节点的前一个结点preNode。
不管循环遍历当且结点:
若当前结点与下一个结点重复,则删除,直到重复结点全部删除
比较巧妙的设计为用preNode是否为空,决定head结点。
连接preNode与nowNode
C++ code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
if(head == NULL){
return head;
}
ListNode* preNode = NULL;
ListNode* nowNode = head;
while(nowNode != NULL){
//ListNode* nextNode = nowNode->next;
bool is_del = 0;
if(nowNode->next != NULL && nowNode->val == nowNode->next->val){
is_del = 1;
}
if(!is_del){
preNode = nowNode;
nowNode = nowNode->next;
}else{
int value = nowNode->val;
while(nowNode != NULL && nowNode->val == value){
ListNode* temp = nowNode;
nowNode = nowNode->next;
delete temp;
}
if(preNode == NULL){
head = nowNode;
}else{
preNode->next = nowNode;
}
}
}
return head;
}
};
python code:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteDuplication(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None:
return head
preNode = None
nowNode = head
while nowNode != None:
is_del = 0
if nowNode.next != None and nowNode.val == nowNode.next.val:
is_del = 1
if not is_del:
preNode = nowNode
nowNode = nowNode.next
else:
value = nowNode.val
while nowNode != None and nowNode.val == value:
temp = nowNode
nowNode = nowNode.next
del temp
if preNode == None:
head = nowNode
else:
preNode.next = nowNode
return head