无序链表删除重复项
给定一个没有排序的链表,删除重复项,并保留原顺序
思路
例如一个链表:head–>0–>1->2–>3–>4–>5
逆序为:head->5–>4–>3–>2–>1–0
三个变量 1.outerCur外层循环指向头节点的下一个节点
2.innerCur内层循环用来遍历outerCur后面的节点
- innerPre innerCur的前驱节点
- 双重for循环 第一重for循cur指向头节点的下一个节点第二重for循环令inner指向cur的下一个节点f两个节点的值相同的话
话不多说直接上代码
代码
下面就看代码实现:
//节点引用类
public class LNode {
int data;
LNode next;
}
我们可以先初始化一个链表
int i=1;
LNode head=new LNode();
head.next=null;
LNode temp=null;
LNode cur=head;
for (; i <7 ; i++) {
temp=new LNode();
if (i%2==0)
temp.data=i+1;
else if (i%3==0)
temp.data=i-2;
else
temp.data=i;
temp.next=null;
cur.next=temp;
cur=temp;
}
System.out.println("删除重复节点前:");
for (cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.data+"->");
}
RemoveDupNum(head);
System.out.println();
System.out.println("删除重复节点后:");
for (cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.data+"->");
}
最后我们详细的看看翻转的代码
public static void RemoveDupNum(LNode head){
//思路
/**三个变量 1.outerCur外层循环指向头节点的下一个节点 innerCur内层循环用来遍历outerCur后面的节点 innerPre innerCur的前驱节点
* 双重for循环 第一重for循环令cur指向头节点的下一个节点
* 第二重for循环令inner指向cur的下一个节点
* if两个节点的值相同的话
*/
if(head==null || head.next==null) return;
LNode outerCur=head.next;
LNode innerCur=null;
LNode innerPre=null;
for (; outerCur !=null ; outerCur=outerCur.next) {
for ( innerCur=outerCur.next,innerPre=outerCur; innerCur!=null;) {
if(outerCur.data==innerCur.data){
innerPre.next=innerCur.next;
innerCur=innerCur.next;
}else {
innerPre=innerCur;
innerCur=innerCur.next;
}
}
}
}
这就是一个简单的无序链表删除重复项
讲到这里随便把有序链表的也说完这里就直接给代码了不废话了
/**
* 给定一个有序的链表,删除重复项,并保留原顺序
* 思路:cur指向链表的第一个节点 if(cur.data==cur.next.data) cur.next=cur.next.next;否则 cur=cur.next
* @param head
*/
public static void RemoveDupNum1(LNode head){
if (head==null&&head.next==null)return;
LNode cur=head;
while (cur!=null){
if (cur.next==null){
break;
}
if (cur.data==cur.next.data){
cur.next=cur.next.next;
}else {
cur=cur.next;
}
}
}
如果有什么问题欢迎骚扰
qq:1947832562
个人博客: