9.2链表(一)——移除未排序链表中的重复结点
2015-07-31 14:12
330 查看
[align=left]/**[/align]
[align=left] * 功能:移除未排序链表中的重复结点。[/align]
[align=left] */[/align]
[align=left]两种方法:[/align]
[align=left]1、/*直接迭代访问整个链表,将每个节点加入散列表。若发现有重复元素,则将该节点从链表中移除,[/align]
[align=left] 然后继续迭代。*/[/align]
[align=left] /*Hashtable只是起到检查是否重复的作用,操作仍是在链表上*/[/align]
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;
[align=left] }[/align]
n=
n.
next;
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
2、
/**不使用缓冲区
[align=left] * 用两个指针来迭代:current迭代访问整个链表runner用于检查后续的节点是否重复。[/align]
[align=left] */[/align]
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;
[align=left] }[/align]
[align=left] }[/align]
current=
current.
next;
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]链表节点:[/align]
class
LinkedListNode{
LinkedListNode
next=
null;
int
data;
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
public
LinkedListNode(
int
d){
this.
data=
d;
[align=left] }[/align]
[align=left] [/align]
public
void
appendToTail(
int
d){
LinkedListNode
end=
new
LinkedListNode(
d);
LinkedListNode
n=
this;
while(
n.
next!=
null){
n=
n.
next;
[align=left] }[/align]
n.
next=
end;
[align=left] }[/align]
[align=left] [/align]
public
LinkedListNode
deleteNode(LinkedListNode
head
,int
d
){
LinkedListNode
n=
head;
if(
n.
data==
d)
return
head
.next
;
[align=left] [/align]
while(
n.
next!=
null){
if(
n.
next.
data==
d){
n.
next=
n.
next.
next;
return
head
;
[align=left] }[/align]
n=
n.
next;
[align=left] }[/align]
return
head
;
[align=left] }[/align]
[align=left]}[/align]
[align=left] * 功能:移除未排序链表中的重复结点。[/align]
[align=left] */[/align]
[align=left]两种方法:[/align]
[align=left]1、/*直接迭代访问整个链表,将每个节点加入散列表。若发现有重复元素,则将该节点从链表中移除,[/align]
[align=left] 然后继续迭代。*/[/align]
[align=left] /*Hashtable只是起到检查是否重复的作用,操作仍是在链表上*/[/align]
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;
[align=left] }[/align]
n=
n.
next;
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
2、
/**不使用缓冲区
[align=left] * 用两个指针来迭代:current迭代访问整个链表runner用于检查后续的节点是否重复。[/align]
[align=left] */[/align]
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;
[align=left] }[/align]
[align=left] }[/align]
current=
current.
next;
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]链表节点:[/align]
class
LinkedListNode{
LinkedListNode
next=
null;
int
data;
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
public
LinkedListNode(
int
d){
this.
data=
d;
[align=left] }[/align]
[align=left] [/align]
public
void
appendToTail(
int
d){
LinkedListNode
end=
new
LinkedListNode(
d);
LinkedListNode
n=
this;
while(
n.
next!=
null){
n=
n.
next;
[align=left] }[/align]
n.
next=
end;
[align=left] }[/align]
[align=left] [/align]
public
LinkedListNode
deleteNode(LinkedListNode
head
,int
d
){
LinkedListNode
n=
head;
if(
n.
data==
d)
return
head
.next
;
[align=left] [/align]
while(
n.
next!=
null){
if(
n.
next.
data==
d){
n.
next=
n.
next.
next;
return
head
;
[align=left] }[/align]
n=
n.
next;
[align=left] }[/align]
return
head
;
[align=left] }[/align]
[align=left]}[/align]
相关文章推荐
- 关于lib 和 dll 个人学习总结
- KVM中管理存储池(创建和删除)
- git&&github
- jar重新打包
- Swift属性分类
- 即时获取input输入框里的内容 IE/非IE皆可兼容
- 邮箱、手机号、QQ号正则表达式
- 一道逻辑推理题的C++实现
- SFTP和FTS协议的区别
- Linux下 FTP 常见错误 500 530等错误解决方法
- nodejs 使用 generic-pool 操作 redis数据库
- struts2标签遍历各种形式数据集合
- HTML框架,链接,登录,注册联合应用
- 【剑指Offer面试题】 九度OJ1391:顺时针打印矩阵
- 【Android应用开发技术:应用组件】Intent使用方法
- 【Android应用开发技术:应用组件】Intent基本原理
- xml 序列化 与 反序列化
- 4种java复制文件的方式
- 关于Android Stduio插件的问题
- Android Studio中添加重载函数的方法