题目出自LeetCodehttps://leetcode-cn.com

反转链表

var reverseList = function(head){
    var cur = head;
    var pre = null;
    while(cur != null){
        var temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}

两两交换链表的节点

var swapPairs = function(head) {
    if(head == null || head.next ==null){
        return head
    }
    let next = head.next
    head.next = swapPairs(next.next)
    next.next = head;
    return next
};

判断链表是否有环

var hasCycle = function(head) {
    let slow=head,fast=head;
    while(fast!==null&&fast.next!==null){
        slow = slow.next
        fast = fast.next.next
        if(slow==fast){
            return true 
        }
    }
    return false
};

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

先判断有环,设快慢针相遇在环的a点,则head与慢针一起走,相遇的地方就是环的入口

var detectCycle = function(head) {
    let isCycle = false
    let slow=head,fast=head;
    while(fast!==null&&fast.next!==null){
        slow = slow.next
        fast = fast.next.next
        if(slow==fast){
            isCycle = true
            break
        }
    }
    if(isCycle){
        let cur = head
        while(1){
            if(head==slow){
                return head
            }
            head = head.next
            slow = slow.next
        }
    }
    return null
};

K 个一组翻转链表

var reverseKGroup = function(head, k) {
    var prev = null;
    var curr = head;
    var p1 = null;  
    var p2 = null;
    while(curr !== null) {
        for(var i = 0; i < k; i++) { 
            if(curr === null) {
                return head;
            }
            curr = curr.next;
        }
        p1 = (prev)? prev.next: head;
        p2 = p1.next;
        for(var i = 0; i < k - 1; i++) {
            var next = p2.next;
            p2.next = p1;
            p1 = p2;
            p2 = next;
        }
        if(!prev) {
            prev = head;
            head.next = curr;
            head = p1;
        } else {
            var tempPrev = prev.next;
            prev.next.next = curr;
            prev.next = p1;
            prev = tempPrev;
        }
    }

    return head;
};

删除链表重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3

var deleteDuplicates = function(head) {
    let pHead = head
    if(pHead == null){
        return head
    }
    while(pHead.next !==null){
        if(pHead.val == pHead.next.val){
            pHead.next = pHead.next.next
        }else{
            pHead = pHead.next
        }
    }
    return head
};

删除链表的重复元素 II

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3

var deleteDuplicates = function(head) {
   let saveHead = head
   let pre = {}
   pre.next = head
    let phead = pre 
   while(pre.next){
       let cur = pre.next
       let flag =true
       while(cur.next && cur.next.val == cur.val){
           cur = cur.next
           flag = false
       }
       if(!flag){
           pre.next = cur.next
       }else{
           pre = pre.next
       }
   }
    return phead.next
};

从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

var removeDuplicates = function(nums) {
    for(let i = 0;i<nums.length-1;i++){
        if(nums[i]==nums[i+1]){
            nums.splice(i,1)
            i-- //移除之后下标i要回退一位
        }
    }
    return nums.length
};

买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

var maxProfit = function(prices) {
    var res = 0
    for(let i = 0;i<prices.length-1;i++){
        if(prices[i+1]>prices[i]){
            res+=prices[i+1]-prices[i]
        }
    }
    return res
};

旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

var rotate = function(nums, k) {
    let count = k%nums.length
    if(count == 0){
        return 
    }else{
        for(let i = 0;i<count;i++){
            let item = nums.pop()
            nums.unshift(item)
        }
        return 
    }
};

顺(逆)时针旋转数组90度

function rotate90(arr) {
    let newArr = []
    let length = arr[0].length
    for (let i = 0; i < length; i++) {
        newArr[i] = []
    }
    for (let i = 0; i < arr.length; i++) {

        for (let j = 0; j < arr[0].length; j++) {
            newArr[j][length - 1 - i] = arr[i][j] //顺时针旋转
            // newArr[i][j] = arr[j][length-1-i]//逆时针旋转
        }
    }
    console.log(newArr)
}
rotate90([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

数组转置

function transposition(arr) {
    let newArr = []
    let length = arr[0].length
    for (let i = 0; i < length; i++) {
        newArr[i] = []
    }
    for (let i = 0; i < arr.length; i++) {

        for (let j = 0; j < arr[0].length; j++) {
            newArr[i][j] = arr[j][i]
        }
    }
    console.log(newArr)
}

顺时针打印数组

//顺时针打印数组
function printArr(matrix) {
    let output = []
    output.push(matrix.shift())
    while (matrix[0]) {
        if (matrix[0].length) matrix = rotateMatrix(matrix);
        output.push(matrix.shift());
    }
    console.log([...matrix])
}
const rotateMatrix = matrix => {
    let newMatrix = [];
    for (let j = matrix[0].length - 1; j >= 0; j--) {
        let tempMatrix = [];
        for (let i = 0; i < matrix.length; i++) {
            tempMatrix.push(matrix[i][j])
        }
        newMatrix.push(tempMatrix)
    }
    return newMatrix
};

原地旋转数组

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
let len = matrix.length
    for (let i = 0; i < len / 2; i++) {
        let start = i
        let end = len - i - 1
        for (let j = 0; j < end - start; j++) {
            let temp = matrix[start][start + j];
            matrix[start][start + j] = matrix[end - j][start];
            matrix[end - j][start] = matrix[end][end - j];
            matrix[end][end - j] = matrix[start + j][end];
            matrix[start + j][end] = temp;
        }
    }
    return matrix
};