/**
* 功能:移除未排序链表中的重复结点。
*/
两种方法:
1、
/*直接迭代访问整个链表,将每个节点加入散列表。若发现有重复元素,则将该节点从链表中移除,
然后继续迭代。*/
/*Hashtable只是起到检查是否重复的作用,操作仍是在链表上*/
public
static
void
deleteDups(LinkedListNode
n
){
Hashtable
table
=
new
Hashtable();
LinkedListNode
pre
=
null
;
while
(
n
!=
null
){
if
(
table
.containsKey(
n
.
data
)){
pre
.
next
=
n
.
next
;
//移除重复结点
}
else
{
table
.put(
n
.
data
,
true
);
pre
=
n
;
}
n
=
n
.
next
;
}
}
2、
/**不使用缓冲区
* 用两个指针来迭代:current迭代访问整个链表runner用于检查后续的节点是否重复。
*/
public
static
void
deleteDups2(LinkedListNode
head
){
if
(
head
==
null
)
return
;
LinkedListNode
current
=
head
;
while
(
current
!=
null
){
LinkedListNode
runner
=
current
;
while
(
runner
.
next
!=
null
){
if
(
runner
.
next
.
data
==
current
.
data
){
runner
.
next
=
runner
.
next
.
next
;
}
else
{
runner
=
runner
.
next
;
}
}
current
=
current
.
next
;
}
}
}
链表节点:
class
LinkedListNode{
LinkedListNode
next
=
null
;
int
data
;
public
LinkedListNode(
int
d
){
this
.
data
=
d
;
}
public
void
appendToTail(
int
d
){
LinkedListNode
end
=
new
LinkedListNode(
d
);
LinkedListNode
n
=
this
;
while
(
n
.
next
!=
null
){
n
=
n
.
next
;
}
n
.
next
=
end
;
}
public
LinkedListNode deleteNode(LinkedListNode
head
,
int
d
){
LinkedListNode
n
=
head
;
if
(
n
.
data
==
d
)
return
head
.
next
;
while
(
n
.
next
!=
null
){
if
(
n
.
next
.
data
==
d
){
n
.
next
=
n
.
next
.
next
;
return
head
;
}
n
=
n
.
next
;
}
return
head
;
}
}