关于链表的面试题(一)

1.反转一个单链表

2.给定一个带头结点head的非空单链表,返回链表中的中间结点。如果有两个         中间结点,返回第二个中间结点。 

3.输入一个链表,输出该链表中倒数第k个结点 

4.将两个有序链表合并成为一个新的有序链表并返回。 

5.删除链表中等于给定值val的所有结点 

一、反转一个单链表

我们首先来思考一下怎么才能将一个链表反转

最简单的方法就是我们可以利用头插法的思想来进行转换

 我们首先创建一个cur使它等于head(头)

同时我们定义一个newHead的链表指向空。

我们通过将遍历cur,同时将newHead指向cur来完成。

 代码实现:

    public Node reverseList() {
        if(this.head==null||this.head.next==null)return head;
        Node newHead=null;
        Node cur=this.head;
        while (cur!=null){
            Node curNext=cur.next;
            cur.next=newHead;
            newHead=cur;
            cur=curNext;
        }
        return newHead;
    }

代码运行:

二、给定一个带头结点head的非空单链表,返回链表中的中间结点。如果有两个中间结点,返回第二个中间结点。 

这个题目我们可以采用类似于快慢指针的方法来结题

我们通过定义两个链表fast和slow我们让fast走两步然后让slow走一步

就可以实现中间结点的返回,返回slow

代码实现 :

    public Node middleNode() {
        Node fast=this.head;
        Node slow=this.head;

        while (fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }

代码运行:

三、输入一个链表,输出该链表中倒数第k个结点 

对于这种题目我们可以采用快慢链表中间相差k-1个的方式遍历。

 我们先让fast向前遍历k-1个,就比如说我要找倒是第三个

 然后我们在遍历就可以让slow变成倒数第三个

代码实现:

    public Node FindKthToTail(int k) {
        if(head==null) return null;
        if(k<=0){
            System.out.println("输入的数字有错误");
            return null;
        }
        Node fast=this.head;
        Node slow=this.head;
        while(k-1!=0){
            if(fast.next!=null){
                fast=fast.next;
                k--;
            }else {
                return null;
            }
        }
        while (fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }

代码运行:

System.out.println(myLinkedList01.FindKthToTail(3).vel);

四、将两个有序链表合并成为一个新的有序链表并返回。 

对于这种题目我们采用定义头结点的方式来创建

 我们通过temp将他们中间互相穿插起来然后最后newHead.next为头节点来结题

代码实现:

    public Node mergeTwoLists(Node headA, Node headB) {
        if(headA==null)return headB;
        if(headB==null)return headA;
        if(headA == null&&headB == null ) return null;
        Node newHead=new Node(-1);
        Node temp=newHead;

        while(headA!=null&&headB!=null){
            if(headA.vel<headB.vel){
                temp.next=headA;
                headA=headA.next;
            }else{
                temp.next=headB;
                headB=headB.next;
            }
            temp=temp.next;
        }
        if(headA==null){
            temp.next=headB;
        }

        if(headB==null){
            temp.next=headA;
        }
        return newHead.next;
    }

代码运行:

myLinkedList01.dispaly02(myLinkedList01.mergeTwoLists(myLinkedList01.head,myLinkedList02.head));

五、删除链表中等于给定值val的所有结点 

对于这种题我们要采取前后结点,判断前结点是否是对应的值来结题

 我们判断cur是否是对应的值是的话将pev.next=cur.next;

代码实现:

    public void removeAllvel(int vel){
        if(this.head==null) return;
        Node pev=this.head;
        Node cur=this.head.next;
        while(cur!=null){
            if(cur.vel==vel){
                pev.next=cur.next;
                cur=cur.next;
            }else{
                pev=cur;
                cur=cur.next;
            }
        }
    }

代码运行:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

now just do it

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值