前言:剑指offer刷题系列
问题1:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
**注意:**此题对比原题有改动
示例:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
思路:
这个题就是课本上的删除链表节点,核心思想就是找到要删除值的节点,然后将当前节点的前面节点的链表指向当前节点的后一个节点的。
函数名为 deleteNode 的函数,它接受两个参数:head 和 val。head 是一个链表的头节点,val 是一个需要删除的值。
首先,判断链表的头节点的值是否等于要删除的值,代码检查头节点的值是否等于val。如果是,则返回头节点的下一个节点,即删除头节点。
接着,代码定义一个名为 cur 的变量,将其初始化为头节点,即指向链表的头节点。
然后进入一个while循环,循环条件是 cur.next 不为 null。
在循环中,代码检查cur.next.val 是否等于val。如果是,则将cur.next 设置为 cur.next.next,即删除cur.next 节点。然后返回头节点。
如果循环中没有找到值等于val 的节点,则将cur 设置为cur.next,继续循环。
最后,如果没有找到要删除的值,就返回原链表。
基于上述思考,代码如下:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var deleteNode = function(head, val) {
if(head.val === val) return head.next
let cur = head
while(cur.next){
if(cur.next.val === val){
cur.next = cur.next.next
return head
}
cur = cur.next
}
};
执行结果如下图:
学到的知识点:
这个题演示了如何遍历链表,如何比较节点的值,以及如何删除一个节点。此外,它还展示了如何使用 while 循环和条件语句来实现算法逻辑。这些都是编程中的基础知识点,对于学习数据结构和算法很有帮助。
问题2:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
思路:
这个题就是将字符串某个字符前的字符转移到字符尾部,形成一个顺时针循环。我的基本思路就是用for循环将字符按要求复制到一个新的字符串里面。
先用一个for循环将原字符串从n开始的后半部分字符串复制到新字符串的前面,再用一个for循环用相同的办法复制原字符串的前半部分到新字符串的后半部分,再输出新字符串即可。
基于上述思考,代码如下:
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function(s, n) {
let res = ''
for(let i = n;i < s.length;i++){
res += s[i]
}
for(let i = 0;i < n;i++){
res += s[i]
}
return res
};
执行结果如下图:
学到的知识点:
1.字符串要用加,不是赋值,不要忘记了!