/*
* 面试题18-题目二:删除链表中重复的节点
* 题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
* 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
* 思路:先新建一个头节点,然后向后查找值相同的节点,重复查找后删除
*/
public class No18deleteDuplication {
public static void main(String[] args) {
No18deleteDuplication n = new No18deleteDuplication();
ListNode p1 = new ListNode(1);
ListNode p2 = new ListNode(2);
ListNode p3 = new ListNode(3);
ListNode p33 = new ListNode(3);
ListNode p4 = new ListNode(4);
ListNode p44 = new ListNode(4);
ListNode p5 = new ListNode(5);
p1.next = p2;
p2.next = p3;
p3.next = p33;
p33.next = p4;
p4.next = p44;
p44.next = p5;
ListNode ln = n.deleteDuplication(p1);
System.out.println(ln.val);
System.out.println (ln.next.val);
System.out.println (ln.next.next.val);
}
public ListNode deleteDuplication(ListNode pHead) {
if (pHead == null) {
return null;
}
// 新建一个节点,防止头结点被删除
ListNode first = new ListNode(-1);
first.next = pHead;
ListNode p = pHead;
// 指向前一个节点
ListNode preNode = first;
while (p != null && p.next != null) {
if (p.val == p.next.val) {
int val = p.val;
// 向后重复查找
while (p != null && p.val == val) {
p = p.next;
}
// 上个非重复值指向下一个非重复值:即删除重复值
preNode.next = p;
} else {// 如果当前节点和下一个节点值不等,则向后移动一位
preNode = p;
p = p.next;
}
}
return first.next;
}
}
面试题18-题目二:删除链表中重复的节点
最新推荐文章于 2021-08-18 15:12:22 发布