JZ56---删除链表中重复的结点

题目

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路

  1. 创建两个链表list1 list2list1指向不确定重不重复的结点。list2指向一直去和下一个结点判断的链表
  2. 首先,需要对原链表pHead进行操作。因为我们不确定,第一个结点或者后面的结点是否重复。如:1 1 1 2 2 2 3
  3. 对第二步的探索,因此我们需要一个空白结点用于确定重不重复结点的精确判断。
    ListNode head = new ListNode(0);
    head.next = pHead;
    ListNode list1 = head; // 用于新链表产生
    ListNode list2 = head.next; // 指向原链表第一个结点
  4. 开始循环。list2作为依次比较当前结点和下一个结点的值是否相同。
    1. 如果相同,继续指向下一个结点
    2. 如果不同,用list1.next = list2.next 暂时保存当前不相同的结点信息。因为不能保证后面那个数据是否相同。
      如:1 1 1 2 2 2 3
      1. 第一次循环结束在1和2中间位置。将ilst2的下一个结点也就是第一个2赋予list1的下一个结点
      2. 第二次循环又检查到,2又开始重复。
      3. 直到第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;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值