2022-2-16剑指offer day6

题1:

JZ76 删除链表中重复的结点

描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5
 
数据范围:链表长度满足 0 \le n \le 1000 \0n1000  ,链表中的值满足 1 \le val \le 1000 \1val1000 
 
进阶:空间复杂度 O(n)\O(n)  ,时间复杂度 O(n) \O(n) 
 
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
 1 /*
 2  public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 public class Solution {
12     public ListNode deleteDuplication(ListNode pHead) {
13         ListNode dummy=new ListNode(0),point=pHead;
14         dummy.next=pHead;
15         ListNode pre=dummy;
16         while (point!=null) {
17             if (point.next!=null&&point.next.val==point.val){
18                while (point.next!=null&&point.next.val==point.val){
19                 point=point.next;
20             }
21             pre.next=point.next;
22             point=point.next;
23             }else {
24                 pre=point;
25                 point=point.next;
26             }
27         }
28         return dummy.next;
29     }
30 }

思路:遍历链表,同时记录上一个节点pre,当遇到重复数字的时候,将pre接到重复节点的末尾。对于链表头部的处理,可以用虚拟头节点。

题2:

JZ18 删除链表的节点

 

描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
 
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
 1 import java.util.*;
 2 
 3 /*
 4  * public class ListNode {
 5  *   int val;
 6  *   ListNode next = null;
 7  *   public ListNode(int val) {
 8  *     this.val = val;
 9  *   }
10  * }
11  */
12 
13 public class Solution {
14     /**
15      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
16      *
17      * 
18      * @param head ListNode类 
19      * @param val int整型 
20      * @return ListNode类
21      */
22     public ListNode deleteNode (ListNode head, int val) {
23         // write code here
24         ListNode dummy=new ListNode(0);
25         dummy.next=head;
26         ListNode pre=dummy,point=head;
27         while (point!=null) {
28             if (point.val!=val){
29                 pre=point;
30                 point=point.next;
31             }else {
32                 pre.next=point.next;
33                 point=point.next;
34             }
35         }
36         
37         
38         return dummy.next;
39     }
40 }

思路:与题1类似,维护pre节点和dummy来实现删除。

posted on 2022-02-16 10:17  阿ming  阅读(24)  评论(0编辑  收藏  举报

导航