10. <tag-链表和去重删除问题>剑指 Offer 18. 删除链表的节点 + lt.83- 删除排序链表中的重复元素 + lt.82- 删除排序链表中的重复元素 II(待补充)
剑指 Offer 18. 删除链表的节点
[案例需求]

[思路分析]
- 对于链表的删除, 我们首先要明确一点: 如果采用遍历的方式删除单例表的某个结点, 一定是先遍历到这个节点的前驱结点. 即 temp.next = 待删除结点, 然后再去执行删除操作(temp.next = temp.next.next)
- 还有一点, 为了保证头结点的删除操作跟其他节点都是相同的, 我们在删除节点时, 一般都需要设置哑结点 dummyNode;
- 更多关于单链表的基础操作的文章: 点我
[代码示例]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
//删除需要前驱结点
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode temp = dummyNode;
while(temp.next != null){
if(temp.next.val == val){
temp.next = temp.next.next;
}else{
temp = temp.next;
}
}
return dummyNode.next;
}
}
lt.83- 删除排序链表中的重复元素
[案例需求]

[思路分析一, 一般性解法]
- 链表去重就是删除重复的结点, 对于链表的删除, 边界的处理很重要;
- 本体因为已经是排序的链表, 所以经过一次遍历便可以对链表去重.
[代码实现]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//已经排序. 其实一次遍历就能解决咯
// ListNode dummyNode = new ListNode(-1);
// dummyNode.next = head; // 其实并不需要哑结点/
ListNode temp = head;
while(true){
if(temp == null || temp.next == null)break;
while(temp.next != null && temp.next.val == temp.val){
temp.next = temp.next.next;
}
temp = temp.next;
}
return head;
}
}
[思路分析二, 递归解法]

[代码实现]
dbc
lt.82- 删除排序链表中的重复元素 II
[案例需求]

[思路分析]
- 借鉴剑指 Offer 18的思路, 设置前驱结点, 把重复结点全部删除, 只连接不重复的结点,
- 本题属于面试高频题目, 有必要掌握迭代和递归两种解法.
- 待补充(https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/solution/fu-xue-ming-zhu-di-gui-die-dai-yi-pian-t-wy0h/)
[代码示例]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode temp = dummyNode;
while(temp.next != null && temp.next.next != null){
if(temp.next.val == temp.next.next.val){
//temp.next = temp.next.next;
int x = temp.next.val;
while(temp.next != null && temp.next.val == x){
temp.next = temp.next.next;
}
}else{
temp = temp.next;
}
}
return dummyNode.next;
}
}

浙公网安备 33010602011771号