删除链表中重复的结点JAVA
删除链表中重复的结点
http://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
-- 非递归版本
这个题目的核心就是删除操作
链表删除重复元素
public ListNode deleteDuplication2(ListNode pHead) {
if (pHead == null || pHead.next == null) {
return pHead;
}
// 新建一个头结点,防止链表中头结点是重复节点被删除··
ListNode head = new ListNode(-1);
head.next = pHead;
ListNode prev = head;
ListNode cur = pHead;
while (cur != null) {
// 这个条件容易写错地方
boolean flag = false;
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
flag = true;
}
if (flag == true) {
// 删除
prev.next = cur.next;
// 链表以重复节点结尾 可以直接返回结果
if (cur.next == null) {
return head.next;
}
} else {
prev = cur;
}
cur = cur.next;
}
return head.next;
}--- 递归版本
稍微有一点不好想
public ListNode deleteDuplication(ListNode pHead) {
// 只有0个或1个节点
if (pHead == null || pHead.next == null)
return pHead;
ListNode next = pHead.next;
// 当前节点是重复节点
if (pHead.val == next.val) {
while (next != null && pHead.val == next.val)
// 跳过值与当前节点相同的全部节点,找到第一个与当前节点不同的节点
next = next.next;
// 从第一个与当前结点不同的结点继续递归
return deleteDuplication(next);
} else { // 当前节点不是重复节点
// 保留当前节点,从下一个节点继续递归
pHead.next = deleteDuplication(pHead.next);
return pHead;
}
}