/**
* 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
* 输入:head = [1,1,2]
* 输出:[1,2]
* 示例 2:
* 输入:head = [1,1,2,3,3]
* 输出:[1,2,3]
* 提示:
* 链表中节点数目在范围 [0, 300] 内
* -100 <= Node.val <= 100
* 题目数据保证链表已经按升序 排列
*/
public class 删除排序链表中的重复元素_留一个 {
/**
* 方法:转移到新NodeList,判断去重
*/
public static Node.IntNode deleteDuplicates(Node.IntNode head) {
//创建新的NodeList
Node.IntNode resNode = new Node.IntNode(-1);
Node.IntNode tempNode = head;
while (tempNode != null) {//遍历将所有元素添加到resNode中
int val = tempNode.val;
//判断去重过程
boolean isAdd = true;
Node.IntNode tempResNode = resNode;
while (tempResNode.next != null) {
tempResNode = tempResNode.next;
if (tempResNode.val == val) {
isAdd = false;
}
}
if (isAdd) {//如果没有重复,拼接新节点
tempResNode.next = new Node.IntNode(val);
}
tempNode = tempNode.next;
}
return resNode.next;
}
/**
* 方法:双指针
*/
public static Node.IntNode deleteDuplicates2(Node.IntNode head) {
//第一个指针:当有重复元素的时候不移动到下一个
Node.IntNode preNode = new Node.IntNode(-111, head);
Node.IntNode currNode = head;
while (currNode != null) {
int val = currNode.val;
if (preNode.val == val) {//比较两个指针的数值是否一样
preNode.next = currNode.next;
}else {//没重复的时候移动前指针
preNode = preNode.next;
}
//每次都移动当前指针
currNode = currNode.next ;
}
return head;
}
public static void main(String[] args) {
Node.IntNode resNode = deleteDuplicates2(Node.getIntNode11135());
Node.IntNode.printNodes(resNode);
}
}