删除链表重复项,利用双指针法来完成
定义两个指针,分别是outerCur
与innerCur
,由两层循环即可完成删除重复项,当outerCur
指向的节点值与innerCur
指向的节点值相同时,将该节点删除,否则继续遍历
链表节点类:
public class LNode {
int data;
LNode next;
}
代码实现:
public class Main{
public static void main(String[] args) {
/* 构造带有重复元素的单链表 0 2 2 4 4 6 6 8 8 10 */
LNode head = new LNode();
head.next = null;
LNode tmp = null;
LNode cur = head;
for (int i = 0; i < 10; i++) {
tmp = new LNode();
if (i % 2 == 0) {
tmp.data = i;
} else {
tmp.data = i + 1;
}
cur.next = tmp;
cur = tmp;
}
printLNode(head);
System.out.println();
deleterepeat(head);
printLNode(head);
}
public static void deleterepeat(LNode head) {
if (head == null || head.next == null) {
return;
}
LNode outerCur = null;
LNode innerCur = null;
LNode innerPre = null;
for (outerCur = head.next; 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 printLNode(LNode head) {
for (LNode cur = head.next; cur != null; cur = cur.next) {
System.out.print(cur.data + " ");
}
}
结果输出:
0 2 2 4 4 6 6 8 8 10
0 2 4 6 8 10