自己的代码写的有点乱。
记录一下书中给的思路吧:
list:1 1 2 3 4 4
- 初始化preNode=null;curNode=head;
- 需要判断该节点是否为重复结点,此处可设置一个标志位;
- 接下来需要思考的是怎样判断是否为重复结点,重复结点如何操作,非重复结点又该如何操作;
- (1)因为该链表是顺序链表,所以当当前结点的值等于下一个结点的值的时候就是重复结点;(2)如果是重复结点就需要定位到后面第一个与重复结点不同的结点;(3)如果是非重复结点就要不断循环直到找到重复结点为止;
- 重复结点怎么定位到下一个结点呢?又要分别考虑头结点,尾结点和一般结点。这个都写在代码里了。
给我的一个思路就是,这个代码只需要两个步骤,重复结点怎么做,非重复结点又该怎么做,进而到判断是否为重复结点。
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);
}
}