题目:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路:
我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。
代码:
/**
* leetcode 83
* @author linwillen
* @create 2020-05-28-17:03
*/
public class DeleteDuplicates {
static ListNode head = null;//链表头的作用
public static void main(String[] args) {
//也可循环建立
DeleteDuplicates.addNode(10);
DeleteDuplicates.addNode(10);
DeleteDuplicates.addNode(30);
DeleteDuplicates.addNode(30);
DeleteDuplicates.addNode(40);
//打印链表
DeleteDuplicates.printList();
DeleteDuplicates.deleteDuplicates(head);
DeleteDuplicates.printList();
}
public static ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while (current != null && current.next != null){
if (current.val == current.next.val){
current.next = current.next.next;
}else{
current = current.next;
}
}
return head;
}
public static void addNode(int d){
ListNode newNode=new ListNode(d);
//处理第一个节点
if(head==null){
head=newNode;
return;
}
ListNode tmp=head;
//注意插入第二个节点时,这个while不执行
while(tmp.next!=null){
tmp=tmp.next;
}
//add Node to end
tmp.next=newNode;
}
public static void printList(){
ListNode tmp=head;
while(tmp!=null){
System.out.print(tmp.val+" ");
tmp=tmp.next;
}
System.out.println();
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}