剑指offer51--删除排序链表重复结点

一、题目


题目:在一个排序的链表中,如何删除重复的结点



二、举例



比如链表 1->2->2->4->4->5->3,那么链表中处理后的结果是:1->2->4->5->3


三、思想


(1)首先需要建立一个保存结点和一个前驱结点

(2)删除操作是需要前驱结点和处理结点来配合的

(3)判断不同情况移动即可



四、程序



package 剑指offer;
public class Test57 {

	public static ListNodeDel deleteRepeatNode(ListNodeDel head){
		if(head == null || head.next == null){
			return null;
		}
		
        // 临时的头结点
        ListNodeDel root = new ListNodeDel();
        root.next = head;
        
        // 记录前驱结点 和 当前处理结点
        ListNodeDel preNode = root;
        ListNodeDel node = head;
        
        while(node != null && node.next != null){
        	if(node.value == node.next.value){
        		while(node.next != null && node.value == node.next.value){
        			node = node.next;
        		}
        		preNode.next = node.next;
        	}else{
        		//将当前处理的结点变成preNode前驱结点
        		preNode.next = node;
                preNode = preNode.next;    		
        	}
        	//处理下一个结点
        	node = node.next;	
        }
        return root.next;
	}
	
	public static void main(String args[]){
	    // 1->2->3->3->4->4->5
        ListNodeDel n1 = new ListNodeDel(1);
        ListNodeDel n2 = new ListNodeDel(2);
        ListNodeDel n3 = new ListNodeDel(3);
        ListNodeDel n4 = new ListNodeDel(3);
        ListNodeDel n5 = new ListNodeDel(4);
        ListNodeDel n6 = new ListNodeDel(4);
        ListNodeDel n7 = new ListNodeDel(5);

        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        n5.next = n6;
        n6.next = n7;

        ListNodeDel result = deleteRepeatNode(n1);
        
        //打印链表的所以结点
        while(result != null){
        	System.out.print(result+"-->");
        	result = result.next;
        }
        System.out.println("null");
	}
	
}

class ListNodeDel{
	int value;
	ListNodeDel next;
	
	ListNodeDel(){
		
	}
	
	ListNodeDel(int value){
		this.value = value;
	}
	
	public String toString(){
		return value+"";
	}
}

-----------------------------output-----------------------------------

1-->2-->5-->null





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值