【剑指Offer】删除链表中重复的结点

自己的代码写的有点乱。

记录一下书中给的思路吧:

list:1 1 2 3 4 4

  1. 初始化preNode=null;curNode=head;
  2. 需要判断该节点是否为重复结点,此处可设置一个标志位;
  3. 接下来需要思考的是怎样判断是否为重复结点,重复结点如何操作,非重复结点又该如何操作;
  4. (1)因为该链表是顺序链表,所以当当前结点的值等于下一个结点的值的时候就是重复结点;(2)如果是重复结点就需要定位到后面第一个与重复结点不同的结点;(3)如果是非重复结点就要不断循环直到找到重复结点为止;
  5. 重复结点怎么定位到下一个结点呢?又要分别考虑头结点,尾结点和一般结点。这个都写在代码里了。

给我的一个思路就是,这个代码只需要两个步骤,重复结点怎么做,非重复结点又该怎么做,进而到判断是否为重复结点。

 

package jianzhiOffer;

class dupNode{
	int data;
	dupNode next;
	
	public dupNode(int d) {
		data = d;
		next = null;
	}
	
	public void displayNode() {
		System.out.print(data + " ");
	}
}

class dupList{
	dupNode first;
	
	public dupList() {
		first = null;
	}
	
	public void insert(dupNode newNode) {
		dupNode cur = first;
		
		if(first == null) {
			first = newNode;
		}
		else {
			while(cur.next != null) {
				cur = cur.next;
			}
			cur.next = newNode;
		}
	}
	
	public void display(dupNode head) {
		dupNode cur = head;
		while(cur != null) {
			cur.displayNode();
			cur = cur.next;
		}
		System.out.println();
	}
}

public class DeleteDuplicatedNode {
	public dupNode delDupNode(dupNode head) {
		dupNode preNode = null;
		int delVal = 0;
		dupNode toBeDel = null;
		dupNode curNode = head;
		boolean needDel = false;
		
		if (curNode==null || curNode.next==null) {
			return head;
		}
		while(curNode != null) {
			if(curNode.next!=null && curNode.data != curNode.next.data) {
				preNode = curNode;
				curNode = curNode.next;
				needDel = false;
			}
			else {
				needDel = true;
				delVal = curNode.data;
				toBeDel = curNode;
			}
			
			if(needDel) {
				//判断必须是toBeDel!=null,不然尾结点就遍历不到,不能删除
				while(toBeDel!=null && toBeDel.data==delVal) {
					toBeDel = toBeDel.next;
				}
				if(preNode == null) {
					head = toBeDel;
				}else {
					preNode.next = toBeDel;
				}
				//因为toBeDel可能为null,所以循环的判断不能用curNode.next!
				curNode = toBeDel;
			}
		}
		return head;
	}
	
	
	public dupNode deleteExample(dupNode head) {
		
		
		
		return head;
	}
	
	public static void main(String[] args) {
		dupNode n1 = new dupNode(1);
		dupNode n2 = new dupNode(1);
		dupNode n3 = new dupNode(2);
		dupNode n4 = new dupNode(3);
		dupNode n5 = new dupNode(3);
		
		dupList l = new dupList();
		l.insert(n1);
		l.insert(n2);
		l.insert(n3);
		l.insert(n4);
		l.insert(n5);
		
		l.display(n1);
		
		DeleteDuplicatedNode del = new DeleteDuplicatedNode();
		dupNode head = del.delDupNode(n1);
		
		l.display(head);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值