1.题目
删除链表中重复的结点,在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
链表删除重复结点
2.分析
- 重复的节点不止一个;排好序,又有重复的结点,那么结点肯定挨着的。、
- 定义
cur
指向头结点;定义一个中间结点newHead
,定义一个引用tmp
指向这个节点,所有不重复的结点就挂在这个节点后面。 - 当
cur
不为空就进入循环,当cur.next!=null,并且cur.val==cur.next.val
,进入循环,当cur.next!=null,并且cur.val==cur.next.val
,cur=cur.next;
- 当
cur.next!=null,并且cur.val==cur.next.val
不成立时候,tmp.next = cur;tmp
和cur
向后移动, - 最后防止最后一个节点也是重复的,应该
tmp.next = null;
- 最后返回头结点
return newHead.next
3.具体步骤
最后一个结点不重复:
最后一个结点是重复的结点,如果上面的例子最后一个56也是34:
4.代码
//删除链表中重复的结点
public ListNode deleteDuplication() {
ListNode cur = head;
ListNode newHead = new ListNode(-1);
ListNode tmp = newHead;
while (cur != null) {
if (cur.next != null && cur.val == cur.next.val) {
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
cur = cur.next;
} else {
tmp.next = cur;
tmp = tmp.next;
cur = cur.next;
}
}
//防止最后一个节点也是重复的
tmp.next = null;
return newHead.next;
}
测试:
public static void main(String[] args) {
MyLinkedList myLinkedList1 = new MyLinkedList();
myLinkedList1.addLast(12);
myLinkedList1.addLast(23);
myLinkedList1.addLast(34);
myLinkedList1.addLast(34);
myLinkedList1.addLast(56);
System.out.println("myLinkedList1:");
myLinkedList1.display();
myLinkedList1.deleteDuplication();
System.out.println("删除重复结点:");
myLinkedList1.display();
}