写在前面:
链表问题,一定要多画图;
有了思路把图画出来基本都能做;
常用方法:
- 快慢指针
- 哨兵节点的使用
- 闭合成环
题目:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
解题思路:
方法1:我自己想的垃圾方法,链表通用:将链表里的值存在数组中,然后处理后再新建链表。
方法2:一次遍历,将值相同的链表都删掉。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode cur = null;
ListNode pre = head;
while (null != pre) {
cur = pre.next;
//该节点和下一个节点的值相同
while (null != cur && pre.val == cur.val) {
pre.next = cur.next;
cur = cur.next;
}
pre = cur;
}
return head;
}
}
题目:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
解题思路:
方法1:我自己想的垃圾方法,链表通用:将链表里的值存在数组中,然后处理后再新建链表。
方法2:一次遍历,将值相同的链表都删掉。为了简化头结点的处理,使用哨兵节点。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//哨兵节点
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
//特殊处理
if (head == null) {
return head;
}
ListNode cur = dummyNode;
while ((cur.next != null) && (cur.next.next != null)) {
if (cur.next.val == cur.next.next.val) {
ListNode pre = cur.next;
while (pre != null && (pre.next != null) && pre.val == pre.next.val) {
pre = pre.next;
}
cur.next = pre.next;
} else {
cur = cur.next;
}
}
return dummyNode.next;
}
}