java笔试题系列之:从无序链表中移除重复项
- 顺序删除
题目描述:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,如链表1->3->1->5->5->7,去掉重复项后变为1->3->5->7。
单链表数据结构:
public class LNode {
int data;
LNode next;
}
顺序删除
主要思路为:
- 通过双重循环直接在链表上执行删除操作。
- 外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另外一个指针遍历其余节点,将与外层循环遍历到的指针所指节点的数据域相同的节点删除
假设外层循环从outerCur开始遍历,当内层循环遍历的节点outerCur.data==innerCur.data时,需要把innerCur指向的节点删除。
具体步骤如下:
- 用tmp记录待删除的节点的地址
- 为了能够在删除tmp节点后继续遍历链表中其余的节点,使innerCur指针指向它的后继节点:innerCur=innerCur.next
- 从链表中删除tmp节点
public class removeDupElement {
/**
* 方法功能:对带头节点宕无序单链表删除重复宕节点
* @param head:链表头节点
*/
public static void removeDup(LNode head){
if(head == null || head.next == null)
return;
//用于外层循环,指向链表第一个节点
LNode outerCur = head.next;
//内层循环用来遍历outerCur后面的节点
LNode innerCur = null;
//innerCur的前驱节点
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;
}
}
}
}
public static void main(String[] args) {
int i = 1 ;
LNode head = new LNode();
head.next = null;
LNode tmp = null;
LNode cur = head;
for(;i<7;i++){
tmp = new LNode();
if(i%2==0)
tmp.data = i + 1;
else if(i%3 == 0)
tmp.data = i - 2;
else
tmp.data = i;
tmp.next = null;
cur.next = tmp;
cur = tmp;
}
System.out.println("删除重复节点前:");
for(cur=head.next;cur!=null;cur=cur.next)
System.out.print(cur.data + "");
removeDup(head);
System.out.println("\n删除重复节点后: ");
for(cur=head.next;cur!=null;cur=cur.next)
System.out.print(cur.data+"");
}
}
输出如下所示: