题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 创建两个链表
list1
list2
。list1
指向不确定重不重复的结点。list2
指向一直去和下一个结点判断的链表 - 首先,需要对原链表
pHead
进行操作。因为我们不确定,第一个结点或者后面的结点是否重复。如:1 1 1 2 2 2 3
- 对第二步的探索,因此我们需要一个空白结点用于确定重不重复结点的精确判断。
ListNode head = new ListNode(0);
head.next = pHead;
ListNode list1 = head; // 用于新链表产生
ListNode list2 = head.next; // 指向原链表第一个结点
- 开始循环。
list2
作为依次比较当前结点和下一个结点的值是否相同。- 如果相同,继续指向下一个结点
- 如果不同,用
list1.next = list2.next
暂时保存当前不相同的结点信息。因为不能保证后面那个数据是否相同。
如:1 1 1 2 2 2 3
- 第一次循环结束在1和2中间位置。将ilst2的下一个结点也就是第一个2赋予list1的下一个结点
- 第二次循环又检查到,2又开始重复。
- 直到第n次循环,不产生重复,就将
list1 = list1.next
AC代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
// 一个结点和无结点。返回原链表
if (pHead == null || pHead.next == null) {
return pHead;
}
// 0 1 2 3 3 4 4 5
ListNode head = new ListNode(0);
head.next = pHead;
ListNode answer = head; // 返回新链表头结点
// 新链表和原链表相差一个,就好操作重复结点
ListNode pre = head; // 用于新链表产生
// 1 1 1 1 1
ListNode last = head.next; // 指向原链表第一个结点
while(last != null){
if(last.next != null && last.val == last.next.val){
while(last.next != null && last.val == last.next.val){
last = last.next;
}
pre.next = last.next;
last = last.next;
}else{
pre = pre.next;
last = last.next;
}
}
// 因为之前自加了一个,后面应该删掉只加的一个
return answer.next;
}
}