题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
这个题目需要自己分析删除的过程:注意两点:一个是不能中间断开,再一个就是头结点是null的情况。
如何不保证断链:分前驱结点和当前结点和下一个结点。三个进行移动操作;
在线编程:
package TestMyselfe;
public class Test57 {
public static class ListNode {
int value;
ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.value = val;
}
@Override
public String toString() {
return value + "";
}
}
public static ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null){
return null;
}
// //如果头结点和下一个结点一样重复【多余】
// if(pHead.value==pHead.next.value){
// return null;
// }
//只有一个结点
if(pHead.next==null){
return pHead;
}
//创建一个新的链表空间
ListNode root = new ListNode();
root.next = pHead;
ListNode node=pHead;//当前结点
ListNode prenode=root;//前驱结点
while(node!=null&& node.next!=null){
// 有重复结点,与node值相同的结点都要删除
if(node.value==node.next.value){
// 找到下一个不同值的节点,注意其有可能也是重复节点
while (node.next != null && node.next.value == node.value) {
node = node.next;//node传递到最后一个重复结点的地方
}
// 指向下一个节点,prev.next也可能是重复结点
// 所以prev不要移动到下一个结点
prenode.next=node.next;//也就是2-->4的意思
}else{
// 相邻两个值不同,说明node不可删除,要保留
prenode.next=node;
prenode=prenode.next;
}
//链表的结点一直走
node=node.next;
}
return root.next;
}
// 1->2->3->3->4->4->5
private static void test01() {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(3);
ListNode n5 = new ListNode(4);
ListNode n6 = new ListNode(4);
ListNode n7 = new ListNode(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
ListNode result = deleteDuplication(n1);
print(result);
}
private static void print(ListNode head) {
while (head != null) {
System.out.print(head + "->");
head = head.next;
}
System.out.println("完美结束");
}
public static void main(String[] args) {
test01() ;
}
}