剑指 Offer 18、20

301 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

18 删除链表的节点

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

解题思路

链表删除的题目,思路很简单,先设置一个空的指针指向头节点,之后循环判断符合条件的直接用链表删除的方法删除即可,代码也很简单,如下:

public ListNode deleteNode(ListNode head, int val) {
    ListNode headPoint = new ListNode(-1);
    headPoint.next = head;
    ListNode cur = headPoint;
    while(cur.next!=null){
        if(cur.next.val == val) {
            cur.next = cur.next.next;
        }else{
            cur = cur.next;
        }
    }
    return headPoint.next;
}

20 表示数值的字符串

要求实现一个函数来判断字符串是否可以表示为数值(包括小数和整数)。

一共有以下几种情况:

数值(按顺序)可以分成以下几个部分:

  1. 若干空格,如( 5)。
  2. 一个 小数 或者 整数
  3. (可选)一个 eE ,后面跟着一个 整数

小数(按顺序)可以分成下面的几个部分:

  1. (可选)一个符号字符(+-
  2. 以及满足下面格式的字符:
    1. 至少包含一位数字,后面跟着一个点 .
    2. 至少包含一位数字,后面跟着一个点 . ,并且后面需要再跟着至少一位数字
    3. 包含一个点 . ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符(+-
  2. 至少一位数字

解题思路

本题的关键点在于将所有符合情况的点摸清,按照此方式编码即可,所有的情况为:

  1. .出现正确情况:只出现一次,并且在e的前面
  2. e出现正确情况:只出现一次,并且在数字后面出现
  3. +-出现正确情况:只能在首位出现或者在e后面一位出现

编码如下:

public boolean isNumber(String s) {
    if (s == null || s.length() == 0) return false;
    s = s.trim();
    boolean numFlag = false;
    boolean dotFlag = false;
    boolean eFlag = false;
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
            numFlag = true;
        } else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {
            dotFlag = true;
        } else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {
            eFlag = true;
            numFlag = false;
        } else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {

        } else {
            return false;
        }
    }
    return numFlag;
}