题目:删除链表中连续重复的节点。
核心方法,首先判定链表不为空或只有一个节点
声明前一节点和当前节点,
一个标志位判断是否需要删除该节点
当当前节点不为最后一个节点且当前节点的值等于下一节点的值时,标志位变为真
如果标志位为假,上一节点和当前节点都向后移
标志位为真,需要删除当前节点和下一节点时,判断再下一节点是否相同
如果头节点相同,删除头节点,相同的节点都跃过去,和不同的节点进行关联
新的节点可能还会出现重复,所以需要从新判断。
package com.helan.c;
public class DeleteNode2 {
public static class Listnode{//链表
int val;
Listnode next;
public Listnode(int val, Listnode next) {
this.val = val;
this.next = next;
}
}
public static Listnode deleteNode2(Listnode head){
if(head==null||head.next==null){
return head;
}
Listnode preNode=null;
Listnode curNode=head;
while(curNode!=null){
boolean ifdel=false;
if(curNode.next!=null&&curNode.val==curNode.next.val){
ifdel=true;
}//3 4 5 5 5 6 cur=5 pre=4
Listnode todel= curNode.next;
if(!ifdel){//如果标志位为假
preNode=curNode;
curNode= curNode.next;
}else {//标志位为真,删除结点
int val=todel.val;//3 4 5 5 5 6
while(todel.next!=null&&todel.next.val==val){
todel=todel.next;
}//判断当头节点就是要删除的节点时
if(preNode==null){//666 789
head=todel.next;
curNode=todel.next;
}else {
preNode.next = todel.next;
curNode = todel.next;
}
}
}
return head;
}
void test(Listnode pHead) {
System.out.println("-----------");
System.out.print("The original list is: ");
Listnode curr=pHead;
if(curr!=null) {
while(curr.next!=null) {
System.out.print(curr.val+",");
curr=curr.next;
}
System.out.println(curr.val);
}else {
System.out.println();
}
pHead=deleteNode2(pHead);
System.out.print("The result list is: ");
curr=pHead;
if(curr!=null) {
while(curr.next!=null) {
System.out.print(curr.val+",");
curr=curr.next;
}
System.out.println(curr.val);
}else {
System.out.println();
}
System.out.println("-----------");
}
/**
* 重复结点位于链表头部
*/
void test1() {
Listnode p4=new Listnode(3, null);
Listnode p3=new Listnode(2, p4);
Listnode p2=new Listnode(1, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 重复结点位于链表尾部
*/
void test2() {
Listnode p4=new Listnode(3, null);
Listnode p3=new Listnode(3, p4);
Listnode p2=new Listnode(2, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 重复结点位于链表中部
*/
void test3() {
Listnode p4=new Listnode(3, null);
Listnode p3=new Listnode(2, p4);
Listnode p2=new Listnode(2, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 连续出现重复结点
*/
void test4() {
Listnode p6=new Listnode(3, null);
Listnode p5=new Listnode(3, p6);
Listnode p4=new Listnode(2, p5);
Listnode p3=new Listnode(2, p4);
Listnode p2=new Listnode(1, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 多个重复结点
*/
void test5() {
Listnode p6=new Listnode(3, null);
Listnode p5=new Listnode(3, p6);
Listnode p4=new Listnode(3, p5);
Listnode p3=new Listnode(2, p4);
Listnode p2=new Listnode(1, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 无重复结点
*/
void test6() {
Listnode p6=new Listnode(6, null);
Listnode p5=new Listnode(5, p6);
Listnode p4=new Listnode(4, p5);
Listnode p3=new Listnode(3, p4);
Listnode p2=new Listnode(2, p3);
Listnode p1=new Listnode(1, p2);
test(p1);
}
/**
* 单个结点
*/
void test7() {
Listnode p1=new Listnode(6, null);
test(p1);
}
/**
* null
*/
void test8() {
Listnode p1=null;
test(p1);
}
public static void main(String[] args) {
new DeleteNode2().test1();
new DeleteNode2().test2();
new DeleteNode2().test3();
new DeleteNode2().test4();
new DeleteNode2().test5();
new DeleteNode2().test6();
new DeleteNode2().test7();
new DeleteNode2().test8();
}
}
那个标志位在while循环里面,不要写错了T-T