返回

JS算法替换空格和从尾到头打印链表

前端

替换空格算法

替换字符串中的空格需要两个步骤:

1. 计算新字符串的长度

新字符串的长度将比原始字符串长,因为每个空格将被替换为三个字符("%20")。计算新长度的公式如下:

newLength = originalLength + (numSpaces * 2)

2. 创建新字符串并逐个字符复制

从原始字符串的末尾开始遍历,逐个字符地复制到新字符串中。当遇到空格时,用"%20"替换它。

function replaceSpaces(str) {
  // 计算新长度
  const newLength = str.length + (str.split(' ').length - 1) * 2;

  // 创建新字符串
  const newStr = new Array(newLength);

  // 从末尾复制到新字符串
  let newStrIndex = newLength - 1;
  for (let i = str.length - 1; i >= 0; i--) {
    const char = str[i];
    if (char === ' ') {
      newStr[newStrIndex--] = '0';
      newStr[newStrIndex--] = '2';
      newStr[newStrIndex--] = '%';
    } else {
      newStr[newStrIndex--] = char;
    }
  }

  return newStr.join('');
}

从尾到头打印链表

从尾到头打印链表需要反转链表:

1. 创建两个指针:prevcurr

prev 指向当前结点的前驱结点,curr 指向当前结点。

2. 遍历链表

在遍历链表时,将 curr 的下一个结点指向 prev,并将 prevcurr 向前移动一步。

3. 返回prev

当到达链表的末尾时,prev将指向链表的第一个结点,返回它即可。

function printLinkedListFromTail(head) {
  if (!head) {
    return;
  }

  // 创建 prev 和 curr 指针
  let prev = null;
  let curr = head;

  // 遍历链表
  while (curr) {
    // 将 curr 的下一个结点指向 prev
    const next = curr.next;
    curr.next = prev;

    // 更新 prev 和 curr 指针
    prev = curr;
    curr = next;
  }

  // 返回 prev(此时指向链表的第一个结点)
  return prev;
}

实际应用

替换空格算法和打印链表算法在现实生活中有很多应用,例如:

  • URL 编码: 替换空格是 URL 编码的一个常见需求,它将空格转换为 "%20" 以便在网络上安全传输。
  • 链表反转: 链表反转用于解决各种问题,例如查找链表中间元素、检查链表是否为回文链表等。