求助,帮忙写一个算法。 已知单链表L,写一算法,删除其重复结点

u010142016 2014-01-06 02:29:01
算法思路:
用指针p指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相同的结点并删除之,p指向下一个,依次类推,p指向最后结点时算法结束。
算法实现:
  void pur_LinkList(LinkList H)
   { LNode *p,*q,*r;
   p=H->next; //指向第一个结点
   if(p==NULL) return;
   while (p->next)
   { q=p;
  while (q->next) // 从*p的后继开始找重复结点
   { if (q->next->data==p->data)
   { r=q->next; //找到重复结点,用r指向,删除*r
   q->next=r->next;
   free(r);
   } /*if*/
   else q=q->next;
   } /*while(q->next)*/
   p=p->next; //指向下一个,继续
   } /*while(p->next)*/
  }
...全文
3877 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
中年風雨 2014-01-09
  • 打赏
  • 举报
回复
忘了加你的要求了,移除重复数据

package com.link;

public class LinkList {
public LinkNode linklist;
public int size;

public LinkList() {
linklist = null;
size = 0;
}

public boolean isEmpty() {
return size==0;
}

public int size() {
return size;
}

public void insertHead(Object v) {
LinkNode node = new LinkNode(v);
node.next = linklist;
linklist = node;
size ++;
}

public void addNode(Object v) {
if (size==0)
insertHead(v);
else {
LinkNode node = new LinkNode(v);
getNode(size-1).next = node;
size++;
}
}

public void removeHead() {
@SuppressWarnings("unused")
LinkNode node = linklist;
linklist = linklist.next;
size --;
node = null;
}

public void removeTail() {
@SuppressWarnings("unused")
LinkNode node = getNode(size-1); //
node = null; //只用于加快java回收
getNode(size-2).next = null;
size --;
}

public void print() {
LinkNode node = linklist;
while (node != null) {
System.out.print(node.data + ",");
node = node.next;
}
System.out.println();
}

public LinkNode getNode(int position) {
if (position<0 || position>size-1) {
return null;
}
LinkNode node = linklist;
for (int i=0;i<position;i++) {
if (i == position)
break;
node = node.next;
}
return node;
}

public void removeNode(int position) {
if (position<0 || position >size-1) return;
if (position ==0) removeHead();
else if (position ==size-1) removeTail();
else {
LinkNode node = getNode(position);
getNode(position-1).next = node.next;
size --;
node = null;
}
}

public void removeNode(LinkNode node) {
// LinkNode n;
for (int i=0;i<size;i++) {
if (getNode(i).data == node.data) //对Object == Object的判断,有时候可能要复杂一些,这里只取最简单的。
removeNode(i);
}
}

public void removeDupNode() {
LinkNode node = linklist;
int cp = 0; //current position

while (node.next != null) {
for (int i=cp+1; i< size; i++) {
if (getNode(i).data == node.data) removeNode(i--);
}
node = node.next;
cp++;
}
}

public static void main(String argv[]) {
LinkList linklist = new LinkList();
for (int i=0;i<10;i++)
linklist.addNode(i);

linklist.print();
linklist.removeNode(9);
linklist.print();

LinkNode node = new LinkNode(3);
linklist.removeNode(node);
linklist.print();

for (int i=0;i<10;i++)
linklist.addNode(i);
linklist.print();
linklist.removeDupNode();
linklist.print();
}
}
中年風雨 2014-01-09
  • 打赏
  • 举报
回复
接上: package com.link; public class LinkNode { public Object data; public LinkNode next; public LinkNode(Object data) { this.data = data; } public void setData(Object data) { this.data = data; } }
中年風雨 2014-01-09
  • 打赏
  • 举报
回复
package com.link; public class LinkList { public LinkNode linklist; public int size; public LinkList() { linklist = null; size = 0; } public boolean isEmpty() { return size==0; } public int size() { return size; } public void insertHead(Object v) { LinkNode node = new LinkNode(v); node.next = linklist; linklist = node; size ++; } public void addNode(Object v) { if (size==0) insertHead(v); else { LinkNode node = new LinkNode(v); getNode(size-1).next = node; size++; } } public void removeHead() { @SuppressWarnings("unused") LinkNode node = linklist; linklist = linklist.next; size --; node = null; } public void removeTail() { @SuppressWarnings("unused") LinkNode node = getNode(size-1); // node = null; //只用于加快java回收 getNode(size-2).next = null; size --; } public void print() { LinkNode node = linklist; while (node != null) { System.out.print(node.data + ","); node = node.next; } System.out.println(); } public LinkNode getNode(int position) { if (position<0 || position>size-1) { return null; } LinkNode node = linklist; for (int i=0;i<position;i++) { if (i == position) break; node = node.next; } return node; } public void removeNode(int position) { if (position<0 || position >size-1) return; if (position ==0) removeHead(); else if (position ==size-1) removeTail(); else { LinkNode node = getNode(position); getNode(position-1).next = node.next; size --; node = null; } } public void removeNode(LinkNode node) { // LinkNode n; for (int i=0;i<size;i++) { if (getNode(i).data == node.data) //对Object == Object的判断,有时候可能要复杂一些,这里只取最简单的。 removeNode(i); } } public static void main(String argv[]) { LinkList linklist = new LinkList(); for (int i=0;i<10;i++) linklist.addNode(i); linklist.print(); linklist.removeNode(0); linklist.print(); LinkNode node = new LinkNode(3); linklist.removeNode(node); linklist.print(); } }
birdg0 2014-01-09
  • 打赏
  • 举报
回复
网上有链表的java实现
u010142016 2014-01-09
  • 打赏
  • 举报
回复
求助!有没有人看看
u010142016 2014-01-06
  • 打赏
  • 举报
回复
谁能帮帮忙呀
u010142016 2014-01-06
  • 打赏
  • 举报
回复
那应该怎么写啊。。
中年風雨 2014-01-06
  • 打赏
  • 举报
回复
这个,有些困难,java没有指针功能啊! 如果强行写,倒也能实现,不过就没有链表的效率与神韵了,只能伪似。
u010142016 2014-01-06
  • 打赏
  • 举报
回复
u010142016 2014-01-06
  • 打赏
  • 举报
回复
这个用C语言写的算法 用JAVA谁会写啊

50,504

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧