제목 설명
노드가 중복 정렬 된 링크 목록에서 중복 된 노드 목록을 삭제, 노드가 반복 유지하지 않는, 헤드 포인터 목록을 반환합니다. 예를 들어,리스트 4-> 5 취급> 2-> 3-> 3-> 4 -> 1 1-> 2-> 5
아이디어 분석
이 때문에 정렬 된 목록이 현재 노드와 다음을 결정 목록을 통과, 우리는 세 가지 포인터를 설정 이전 노드, 현재 노드와 다음 노드로, 다음 페이지, 포인트를 미리 할 수 있습니다 ,, 중복 노드를 삭제 노드는 플래그 비트가 제공되는 동일합니다 needDel
:
아무도 찾을 수없는 경우 1. 포인터가 뒤로 이동 싶었다
2. 그렇지 않으면 true로 설정, 목록이 정렬되어 있기 때문에 당신은 (노드를 반복을 통해 다음주기 검색을 계속할 수 있습니다 )
참고 :
- 하나 개의 노드 목록
- 삭제이 첫 번째 노드의 경우이고
테스트 케이스
- 기능 시험 (목록의 머리, 중앙 꼬리, 아니 중복 노드에있는 중복 노드)
- 특별 시험 (null의 경우, 모든 노드가 반복)
자바 코드
public class Offer18_02 {
public static void main(String[] args) {
System.out.println("****功能测试***");
test1();
System.out.println("***特殊输入测试****");
test2();
}
public static ListNode deleteDuplication(ListNode pHead) {
return Solution1(pHead);
}
/**
*
* 需要设置三个指针,pre pNode 和 next ;
*
* @param pHead
* @return
*/
private static ListNode Solution1(ListNode pHead) {
if (pHead == null || pHead.next == null) {// 如果链表为空或者只有一个节点
return pHead;
}
ListNode pre = null;
ListNode pNode = pHead; // 代表当前节点
while (pNode != null) {// 从头结点开始遍历链表
boolean needDel = false;
ListNode pNext = pNode.next;
if (pNext != null && pNext.val == pNode.val) {
// 如果当前节点的下一个结点不为null 且其值和当前节点相等
needDel = true;
}
if (!needDel) {// 如果没有找到重复的元素就将指针往后移动
pre = pNode;
pNode = pNode.next;
} else { // 找到重复的元素
ListNode toBeDel = pNode;
int value = toBeDel.val;
while (toBeDel != null && toBeDel.val == value) {
// 将指针移到所有重复元素的后面
toBeDel = toBeDel.next;
}
if (pre == null) {// 删除的是第一个节点
pHead = toBeDel;
} else {
pre.next = toBeDel;
}
pNode = toBeDel;
}
}
return pHead;
}
/**
* 功能测试
*/
private static void test1() {//
System.out.println("有两对重复的");
ListNode node6 = new ListNode(6, null);
ListNode node5 = new ListNode(6, node6);
ListNode node4 = new ListNode(3, node5);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);
ListNode pHead = new ListNode(-1, node1);// 头结点
System.out.println("删除之前");
printListNode(pHead);
System.out.println("删除之后--->");
deleteDuplication(pHead);
printListNode(pHead);
}
/**
*
*/
private static void test2() {//
System.out.println("所有的元素都是重复的");
ListNode node6 = new ListNode(1, null);
ListNode node5 = new ListNode(1, node6);
ListNode node4 = new ListNode(1, node5);
ListNode node3 = new ListNode(1, node4);
ListNode node2 = new ListNode(1, node3);
ListNode node1 = new ListNode(1, node2);
ListNode pHead = new ListNode(-1, node1);// 头结点
System.out.println("删除之前");
printListNode(pHead);
System.out.println("删除之后--->");
deleteDuplication(pHead);
printListNode(pHead);
}
/**
* 打印链表
*
* @param pHead
*/
private static void printListNode(ListNode pHead) {
ListNode p = pHead.next;
while (p != null) {
System.out.print(p.val + " ");
p = p.next;
}
System.out.println();
}
}