这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
删除链表的节点
剑指Offer 18.删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:题目保证链表中节点的值互不相同
题解
法一 利用head.next
利用head.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;
}
head.next = deleteNode(head.next,val);
return head;
}
法二 哨兵节点
var deleteNode = function(head,val){
let pre = new ListNode(-1); // 哨兵节点
pre.next = head;
let node = pre;
while(node.next){
if(node.next.val === val){
node.next = node.next.next;
break;
}
node = node.next;
}
return pre.next;
}
时间复杂度O(n),空间复杂度O(1)
调整数组顺序使奇数位于偶数前面
剑指Offer 21.调整数组顺序使奇数位于偶数前面
难度:简单
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
- 0 <= nums.length <= 50000
- 1 <= nums[ i ] <= 10000
题解
法一 sort函数
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
return nums.sort((a,b)=>b%2-a%2)
};
法二 暴力法
需要做2次循环:
- 第一次循环找到偶数和奇数,并存放到各自数组。
- 第二次循环将两个数组连接
var exchange = function(nums){
const arr = [];
const brr = [];
nums.forEach(item => {
item % 2 ? arr.push(item) : brr.push(item);
});
return arr.concat(brr);
}
时间复杂度、空间复杂度均为O(n)
法三 双指针法
将指针分别指向数组头部的指针i,与指向数组尾部的指针j。过程如下:
- i向右移动,直到遇到偶数;j向左移动,直到遇到奇数
- 检查i是否小于j,若小于则交换i和j的元素,回到上一步骤继续移动;否则结束循环
var exchange = function(nums){
const length = nums.length;
if(!length){
return [];
}
let i = 0,j = length - 1;
while(i < j){
while(i < length && nums[i] % 2 === 1) i++;
while(j >= 0 && nums[j] % 2 === 0) j--;
if(i < j){
[nums[i],nums[j]] = [nums[j],nums[i]];
i++;
j--;
}
}
return nums;
}
时间复杂度O(n)、空间复杂度O(1)
坚持每日一练!前端小萌新一枚,希望能点个赞
哇~