能带你起飞的【数据结构】成王第四篇:力扣、牛客链表面试题

目录

前言:

兄弟们,继续开干啊,刷题才是永远的王道!!!!!!

一、链表面试题

1.链表分割

问题描述:

问题分析:

问题解决:

代码实现:

2.删除链表中重复的结点 

问题描述:

 问题分析:

问题解决:

代码实现:


前言:

兄弟们,继续开干啊,刷题才是永远的王道!!!!!!

一、链表面试题

1.链表分割

问题描述:

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点

排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

问题分析:

假设我们有一链表:

 假设给定一个值X,小于X的节点就排在其余节点的之前,且不能改变原来的数据结构,也就说假设给定X=10,那么就是12,3,5,23,56按照这样的顺序排列,不能改变原来的数据结构顺序。

问题解决:

首先,我们可以把小于X的部分和大于X的部分 看成两个链表,分别定义两个节点,bs、be和as、ae,都指向null。在定义一个cur变量等于head,看图:

 然后我们让cur头字节开始往后遍历这个链表,当cur为null就遍历完了。

第一步:比较12与15的大小,因为小于15,所以放在bs,be这段链表中,第一次bs,be都是指向12这个字节,

第二步:

cur继续向后走,因为3又小于15,所以放在bs,be这段链表中,这个时候让be.next = cur,be = be.next。看图:

第三步:cur继续向后走,因为23大于15,所以放在as,ae这段链表中,第一次as,ae都是指向23这个字节,

第四步:cur继续向后走,因为5又小于15,所以放在bs,be这段链表中,这个时候让be.next = cur,be = be.next。看图:

第五步:cur走到最后一个节点, 因为56大于15,所以放在as,ae这段链表中,这时候让ae.next = cur,ae = ae.next,看图:

第六步:让be.next = as,最后返回head就可以了,如图:

 第七步:

这个题大致的思路就清晰了,但是还有一些细节需要处理,我们要思考一下,1.前方可能没有数据,意思就是可能所有的值都要比X大,这种情况我们只需要返回as就可以了。2.最后一个数据一定是大于x的吗?不过小于X我们这个链表就没有尾节点了,所以如果后半段是有数据的情况下,我们必须手动将最后一个字节.next置为null。

代码实现:

public class Partition {
    public ListNode partition(ListNode head, int x) {
        ListNode cur = head;
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        while(cur != null){
            if(cur.val < x){
                if(bs == null){
                    //第一次
                bs = cur;
                be = cur;
            }else{
                    be.next = cur;
                    be = be.next;
                }
            }else{
                if(as == null){
                    as = cur;
                    ae = cur;
                }else{
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
            
        }
        if(bs == null){
            return as;
        }
        be.next = as;
        if(as != null){
            ae.next = null;
        }
        return bs;
        
    }
}

链表分割_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力icon-default.png?t=M276https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking 

2.删除链表中重复的结点 

问题描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5 

 问题分析:

1.重复的元素不止一个

2.重复的元素一定是紧挨在一起的

问题解决:

一样的,定义两个引用变量,head和cur变量,head一直指向链表头节点,cur向后遍历找重复的节点:

首先我们要判断第一个节点等不等于第二个节点:cur.val等不等于cur.next.val,有可能第一个节点也是和后面重复,但我们要删除重复的节点,这样最后容易造成找不到我们的头节点,所以我们再创建一个虚拟节点,让所有不重复的节点都在虚拟节点的后头。创建一个虚拟节点newHead,定义一个tmp代替newHead去走,

 12和23一样吗,不一样就要把cur和tmp串起来,让tmp.next = cur

然后让tmp= tmp.next, cur = cur.next 。

所以这样我们就可以写一个循环,l来看代码吧 

代码实现:

public class Solution {
    public ListNode deleteDuplication(ListNode head) {
        ListNode newHead = new ListNode(-1);
        ListNode tmp = newHead;
        ListNode cur = head;
        while(cur != null){
            if(cur.next != null && cur.val == cur.next.val){
                while(cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;
                }
                cur = cur.next;
            }else{
                tmp.next = cur;
                tmp = tmp.next;
                cur = cur.next;
            }
           
        }
        tmp.next = null;
        return newHead.next;

    }
}

删除链表中重复的结点_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力icon-default.png?t=M276https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&&tqId=11209&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking 

兄弟们一定要多刷题啊,一起加油! 

猜你喜欢

转载自blog.csdn.net/m0_64397675/article/details/123486067