持续创造,加速成长!这是我参加「掘金日新方案 10 月更文挑战」的第16天,点击查看活动详情

‍作者简介:一位喜爱写作,计科专业的大三菜鸟

个人主页:starry陆离 的个人主页

假如文章有帮到你的话记得点赞+收藏支持一下哦

『牛客|每日一题』循环链表

1.每日一题

描绘 请你完成一个链表。 操作:

  • insert x y:将y参加链表,刺进在榜首个值为x的结点之前。若链表中不存在值为x的结点,则刺进在链表末尾。保证x,y为int型整数。
  • delete x:删去链表中榜首个值为x的结点。若不存在值为x的结点,则不删去。

输入描绘: 榜首行输入一个整数n (1 < n < 104 ),表示操作次数。 接下来的n行,每行一个字符串,表示一个操作。保证操作是标题描绘中的一种。

输出描绘: 输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出”NULL”(不含引号)。

『牛客|每日一题』循环链表

2.测验事例

5
insert 0 1
insert 0 3
insert 1 2
insert 3 4
delete 4
2 1 3

3.思路剖析

这题是要我们自己完成一个链表。链表是一种物理结构上非连续、非顺序的存储结构。而链表中常用的便是增修改查。

3.1增

将y值刺进到x节点之前

  1. 找到节点x的前一个节点xp,
  2. 让节点y指向节点x,也便是y.next=xp.next
  3. 最后让节点xp指向节点y,也便是xp.next=y

『牛客|每日一题』循环链表

3.2删

删去节点x

  1. 找到节点x的前一个节点xp,
  2. 让xp指向x的下一个节点,即xp.next=xp.next.next

『牛客|每日一题』循环链表

4.代码完成

import java.util.*;
​
public class Main {
  public static void main(String[] args){
    Scanner sca=new Scanner(System.in);
    MyList list=new MyList();
    int n=sca.nextInt();
    sca.nextLine();
    String[] s;
    String op;
    int x,y;
    for(int i=0;i<n;++i){
      s=sca.nextLine().split(" ");
      op=s[0];
      x=Integer.parseInt(s[1]);
      if(op.equals("insert")){
        y=Integer.parseInt(s[2]);
        list.insert(x,y);
       }else{
        list.delete(x);
       }
     }
    System.out.println(list);
   }
}
//界说节点
class Node{
  int val;//值
  Node next;//指向下一个节点
  public Node(int val){
    this.val=val;
   }
}
//自界说链表
class MyList{
  Node root;//头节点
  public MyList(){
    root =new Node(-1);
   }
  
  //查找值为x的节点的前一个节点
  public Node findPre(int x){
    Node cur=root;
    while(cur.next!=null&&cur.next.val!=x){
      cur=cur.next;
     }
    return cur;
   }
  
  //将y值刺进到x节点之前
  public void insert(int x,int y){
    Node xPre=findPre(x);//查找值为x的节点的前一个节点
    Node yNode=new Node(y);//创立y节点
    yNode.next=xPre.next;//节点y的下一个节点是x节点指向的下一个节点
    xPre.next=yNode;//更新x节点的下一个节点是y节点
   }
  
  //删去节点x
  public void delete(int x){
    Node xPre=findPre(x);//查找值为x的节点的前一个节点
    if(xPre.next!=null){
      xPre.next=xPre.next.next;
     }
   }
  
  //输出链表中的值
  public String toString(){
    StringBuffer sb=new StringBuffer();
    if(root.next==null){
      return "NULL";
     }else{
      Node cur=root.next;
      while(cur!=null){
        sb.append(cur.val+" ");
        cur=cur.next;
       }
     }
    return sb.toString();
   }
}

『牛客|每日一题』循环链表

5.每日引荐

订阅专栏:牛客刷题集锦 – starry陆离的专栏 – 掘金 ())

每日引荐:根底算法不管在研究生面试还是求职面试都是十分重要的一环,这里引荐一款算法面试神器:牛客网-面试神器;算法题只要多刷勤刷才干坚持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)

『牛客|每日一题』循环链表

假如文章有帮到你的话记得点赞+收藏支持一下哦