题目主要信息:给定一个从小到大排好序的链表删去链表中重复的元素,每个值只留下一个节点举一反三:学习完本题的思路你可以解决如下题目:BM16. 删除有序链表中重复的元素-II方法:遍历删除(推荐使用)思路:既然连续相同的元素只留下一个,我们留下哪一个最好呢?当然是遇到的第一个元素了!if(cur.val == cur.next.val)     cur.next = cur.next.next;因为第一个元素直接就与前面的链表节点连接好了,前面就不用管了,只需要跳过后面重复的元素,连接第一个不重复的元素就可以了,在链表中连接后面的元素总比连接前面的元素更方便嘛,因为不能逆序访问。具体做法:step 1:判断链表是否为空链表,空链表不处理直接返回。step 2:使用一个指针遍历链表,如果指针当前节点与下一个节点的值相同,我们就跳过下一个节点,当前节点直接连接下个节点的后一位。step 3:如果当前节点与下一个节点值不同,继续往后遍历。step 4:循环过程中每次用到了两个节点值,要检查连续两个节点是否为空。图示:Java实现代码:import java.util.*;public class Solution {    public ListNode deleteDuplicates (ListNode head) {        //空链表        if(head == null)             return null;        //遍历指针        ListNode cur = head;         //指针当前和下一位不为空        while(cur != null && cur.next != null){             //如果当前与下一位相等则忽略下一位            if(cur.val == cur.next.val)                 cur.next = cur.next.next;            //否则指针正常遍历            else                 cur = cur.next;        }        return head;    }}C++实现代码:class Solution {public:    ListNode* deleteDuplicates(ListNode* head) {        //空链表        if(head == NULL)             return NULL;        //遍历指针        ListNode* cur = head;         //指针当前和下一位不为空        while(cur != NULL && cur->next != NULL){             //如果当前与下一位相等则忽略下一位            if(cur->val == cur->next->val)                 cur->next = cur->next->next;            //否则指针正常遍历            else                 cur = cur->next;        }        return head;    }};Python实现代码class Solution:    def deleteDuplicates(self , head: ListNode) -> ListNode:        #空链表        if head == None:             return None        #遍历指针        cur = head         #指针当前和下一位不为空        while cur and cur.next:             #如果当前与下一位相等则忽略下一位            if(cur.val == cur.next.val):                  cur.next = cur.next.next            #否则指针正常遍历            else:                 cur = cur.next        return head复杂度分析:时间复杂度:O(n)O(n)O(n),其中nnn为链表长度,遍历一次链表空间复杂度:O(1)O(1)O(1),常数级指针变量使用,没有使用额外的辅助空间
点赞 23
评论 6
全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器->这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题->后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务