剑指offer系列——56.删除链表中重复的结点
Q:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
A:题目并不难,重要的是,可以在head前添加一个头结点,防止head被删的情况。
ListNode *deleteDuplication(ListNode *pHead) {
if (pHead == nullptr || pHead->next == nullptr)
return pHead;
ListNode *node = new ListNode(0);
node->next = pHead;
pHead = node;
ListNode *temp = pHead;
while (node->next != nullptr) {
if (node->val == node->next->val) {
while (temp->next != node)
temp = temp->next;
while (node->next != nullptr && node->val == node->next->val)
node = node->next;
temp->next = node->next;
node->next = nullptr;
node = temp->next;
} else {
node = node->next;
}
}
return pHead->next;
}
Q:给出一个排好序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1->2->3->3->4->4->5, 返回1->2->5.
给出的链表为1->1->1->2->3, 返回2->3.
A:
public static ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode newHead = new ListNode(Integer.MIN_VALUE);
newHead.next = head;
ListNode cur = head;
ListNode last = newHead;
while (cur != null && cur.next != null) {
if (cur.val != cur.next.val) {
last = cur;
} else {
while (cur.next != null && cur.val == cur.next.val)
cur = cur.next;
last.next = cur.next;
}
cur = cur.next;
}
return newHead.next;
}