题目描述
在一个排序的数组中,删除重复的元素
数组a[]用两个指针,i,j
初始 i=0,j = 1
让j向后遍历,如果j指针表示的数字和i指针表示的数字不同,则将a[i + 1] = a[j]
j节点遍历完就停止遍历,此时数组从0位置到i+1位置就是删除重复元素后的数组。
package Sword_to_Offer;
/**
* @program: Sword_to_Offer
* @author: GoKu
* @create: 2019-09-25 16:54
*/
public class 删除排序数组重复的元素 {
static int[] removeDuplicates(int[] a){
int i = 0;
for(int j = 1;j < a.length;j++){
if(a[j] != a[i]){
i++;
a[i] = a[j];
}
}
int result[] = new int[i+1];
for( i = 0;i < result.length;i++){
result[i] = a[i];
}
return result;
}
public static void main(String[] args) {
int[] s = {1,1,3,4,5,5,6};
int[] d = removeDuplicates(s);
for(int i = 0;i < d.length;i++)
System.out.println(d[i]);
}
}
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
输入: 1->1->2
输出: 1->2
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) return head;
ListNode pre = head;
ListNode next = head.next;
while (next != null){
if(pre.val == next.val){
pre.next = next.next;
next = next.next;
}else{
next = next.next;
pre = pre.next;
}
}
return head;
}
}
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
需要两个指针,一个指向当前节点node,一个指向前一个节点pre,如果遇到相同的节点node就向后移动,直到节点不相同
把pre指向node.next
public ListNode deleteDuplication2(ListNode pHead)
{
if(pHead == null) return pHead;
ListNode pre = null;
ListNode node = pHead;
while (node != null){
if(node.next != null && node.val == node.next.val){
int value = node.val;
while (node.next != null && node.next.val == value)
node = node.next;
if(pre == null){
pHead = node.next;
}else pre.next = node.next;
}else pre = node;
node = node.next;
}
return pHead;
}