[剑指 Offer 第 2 版第 18 题] “删除链表中重复的结点”做题记录
- 牛客网 online judge 地址:https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&tqId=11209&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
求解思路与关键
- 画出示意图,要考虑到连续重复结点出现的情况。
参考解答
参考解答1
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
public ListNode(int[] arr) {
if (arr == null || arr.length == 0) {
throw new IllegalArgumentException("arr can not be empty");
}
this.val = arr[0];
ListNode cur = this;
for (int i = 1; i < arr.length; i++) {
cur.next = new ListNode(arr[i]);
cur = cur.next;
}
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
ListNode cur = this;
while (cur != null) {
s.append(cur.val + " -> ");
cur = cur.next;
}
s.append("NULL");
return s.toString();
}
}
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
ListNode dummyNode = new ListNode(-1);
dummyNode.next = pHead;
ListNode curNode = dummyNode;
while (curNode.next != null && curNode.next.next != null) {
ListNode next = curNode.next;
ListNode nextNext = next.next;
if (next.val == nextNext.val) {
while (nextNext.next != null && nextNext.val == nextNext.next.val) {
nextNext = nextNext.next;
}
ListNode delNode = nextNext;
curNode.next = delNode.next;
delNode.next = null;
} else {
curNode = curNode.next;
}
}
return dummyNode.next;
}
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 3, 4, 4, 5};
ListNode head = new ListNode(nums);
System.out.println(head);
Solution solution = new Solution();
ListNode deleteDuplication = solution.deleteDuplication(head);
System.out.println(deleteDuplication);
}
}