1. 本题知识点
链表
2. 题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
3. 解题思路
遍历链表,将其加入一个队列。
- 队列为空,元素直接加入队列。
- 加入元素和队尾元素相同,不让入队,并设置重复值。
- 加入元素和队尾元素不同,可以加入队列。此时,重复值如果和队尾元素相同,队尾元素要先出队。
遍历完成后,重复值如果和队尾元素相同,队尾元素出队
最后,将队列转换为链表,返回即可
4.代码
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
// 链表为空,直接返回头结点
if (pHead == null || pHead.next == null) {
return pHead;
}
ListNode head = null;
ListNode cur = null;
// 双向队列
Deque<ListNode> queue = new LinkedList();
// 重复值
int repeat = 0;
// 遍历链表
while(pHead != null) {
// 队列为空,直接加入队列
if (queue.isEmpty()) {
queue.offer(pHead);
}
// 加入元素和队尾元素不同,直接加入队列
else if (pHead.val != queue.peekLast().val) {
// 此时,重复值如果和队尾元素相同,队尾元素出队
if (repeat != -1 && repeat == queue.peekLast().val) {
queue.pollLast();
}
queue.offer(pHead);
}
// 加入元素和队尾元素相同,不让入队,并设置重复值
else if (pHead.val == queue.peekLast().val) {
repeat = queue.peekLast().val;
}
pHead = pHead.next;
}
// 最后,重复值如果和队尾元素相同,队尾元素出队
if (repeat == queue.peekLast().val) {
queue.pollLast();
}
// 将队列转换为链表,返回即可
while(!queue.isEmpty()) {
if (head == null) {
head = queue.peek();
cur = queue.poll();
continue;
} else {
cur.next = queue.poll();
cur = cur.next;
}
}
if (cur != null) {
cur.next = null;
}
return head;
}
}