返回
JS算法替换空格和从尾到头打印链表
前端
2023-10-11 19:40:43
替换空格算法
替换字符串中的空格需要两个步骤:
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. 创建两个指针:prev
和curr
prev
指向当前结点的前驱结点,curr
指向当前结点。
2. 遍历链表
在遍历链表时,将 curr
的下一个结点指向 prev
,并将 prev
和 curr
向前移动一步。
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" 以便在网络上安全传输。
- 链表反转: 链表反转用于解决各种问题,例如查找链表中间元素、检查链表是否为回文链表等。