一、题目
题目:在一个排序的链表中,如何删除重复的结点
二、举例
比如链表 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