删除链表中重复节点
在一个
排序
的链表
中,存在重复
的结点,请删除该链表中重复的结点
,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
一定要注意算法题目中的关键字眼: 有序
思路
遍历整个链表,当前节点的值与下一节点值相同,那么他就是重复的节点,可以被删除
为了保证删除之后的链表仍然是项链的,我们要把当前节点的前一个节点和后面值比当前节点值大的节点相连接,我们要确保preNode始终与下一个没有重复的节点连接在一起
package B链表;
import java.util.HashSet;
import java.util.Iterator;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/1/31 0031 23:47
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
*/
public class Problem3 {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3= new ListNode(3);
ListNode listNode4 = new ListNode(3);
ListNode listNode5= new ListNode(4);
ListNode listNode6= new ListNode(4);
ListNode listNode7= new ListNode(4);
ListNode listNode8= new ListNode(4);
ListNode listNode9= new ListNode(5);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
listNode4.next = listNode5;
listNode5.next = listNode6;
listNode6.next = listNode7;
listNode7.next = listNode8;
listNode8.next = listNode9;
ListNode head = Problem3.deleteDuplication2(listNode1);
head.list();
}
// /**
// * 使用HashSet:这种方法
// * @param pHead
// * @return
// */
// public static ListNode deleteDuplication1(ListNode pHead) {
//
// HashSet<Integer> hashSet = new HashSet<>();
//
// ListNode temp = pHead;
// //加入到Set中
// while(temp.next!=null){
// hashSet.add(temp.val);
// temp=temp.next;
// }
//
// Iterator<Integer> itr = hashSet.iterator();
// Integer value = itr.next();
// ListNode head = new ListNode(value);
// ListNode temp1 = head;
//
// while(itr.hasNext()){
// value = itr.next();
// ListNode node = new ListNode(value);
// temp1.next = node;
// temp1 = node;
// }
// return head;
// }
//使用辅助变量两两比较
public static ListNode deleteDuplication2(ListNode pHead){
//定义三个辅助指针
//这个指针用于删除节点
ListNode temp1 = pHead;
//下面两个指针用于遍历链表进行比较从而删除指针
ListNode temp2 = pHead.next;
ListNode temp3 = pHead.next.next;
while(temp3!=null){
//有相等的数据
if(temp2.val==temp3.val){
//一个相等的数据删完
int val = temp2.val;
while(temp3!=null && temp3.val==val){
temp1.next = temp3.next;
temp3 = temp3.next;
}
temp2 = temp3;
temp3 = temp3.next;
}else {//不是相等的数据,所有指针超前移动一位
temp1 = temp1.next;
temp2 = temp2.next;
temp3 = temp3.next;
}
}
//返回头节点
return pHead;
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
public void list(){
ListNode temp = this;
while(temp!=null){
System.out.println(temp.val);
temp = temp.next;
}
}
}