IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表练习记录 -> 正文阅读

[数据结构与算法]链表练习记录

链表练习记录

一、首先是找链表中点(快慢指针)

function findCenter(head){
    let fast = head,slow = head;
    while(fast||fast.next!==null){
          slow = slow.next
          fast = fast.next.next
     }
     if(fast!==null){
        slow =slow.next
}
  return slow
}

二、接着是反转链表

function reverse(head){
    let arr= []
    let node = head
    while(head){
      arr.push(head.val)
      head = head.next
    }
     let res = node//现在node已经在原链表的末端
     while(node){
         node.val= arr.pop()
         node = node.next
   }
   return res
}

或者

function reverse(head){
    if(head==null||head.next==null)return head
    let res = reverse(head.next)//现在res在原链表末端,因为使用了递归
    head.next.next=head
    head.next =null
    return res
}

三、合并有序链表

function merge(l1,l2){
  let dummy = new listNode(0)
  let prev = dummy
  while(l1&&l2){
       if(l1.val<l2.val){
          prev.next = l1
          l1 = l1.next
        }else{
        prev.next = l2
        l2 = l2.next
       }
       prev= prev.next
  }
    if (l1) prev.next = l1;
    if (l2) prev.next = l2;
    return dummy.next
}

四、给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
此题借助上面的方法可以做出:

var sortList = function (head) {
    if (!head || !head.next)  return head;
    let slow = head, fast = head;
    let preSlow = null;
    while (fast && fast.next) {//这里先找到中点之前的那个节点,成为preSlow
        preSlow = slow;
        slow = slow.next;//中点
        fast = fast.next.next;
    }
    preSlow.next = null;
    const l = sortList(head);//分左右两边分别进行递归,归并算法,分解成最小单位
    const r = sortList(slow);
    return merge(l, r);
};
//合并有序链表
function merge(l1, l2) {
    const dummy = new ListNode(0);
    let prev = dummy;
    while (l1 && l2) {
        if (l1.val < l2.val) {
            prev.next = l1;
            l1 = l1.next;
        } else {
            prev.next = l2;
            l2 = l2.next;
        }
        prev = prev.next;
    }
    if (l1) prev.next = l1;
    if (l2) prev.next = l2;
    return dummy.next;
}

五、回文链表
同样可以借助以上方法,找到中点,然后找到末端,将中点到末端的这一部分进行反转,然后与前面一段相比较

var isPalindrome = function(head) {
        let right = reverse(findCenter(head))
        let left= head
        //开始比较
        while(right){
            if(left.val!==right.val){
                return false
            }
            left = left.next
            right = right.next
        }
        return true
};

//找中点
function findCenter(head){
    let slow = head,fast = head;
    while(fast&&fast.next!==null){
        slow = slow.next
        fast = fast.next.next
    }
    if(fast!==null){
        slow = slow.next
    }
    return slow
}
//反转链表
function reverse(head){
    let arr = []
    let node = head
    while(head){
        arr.push(head.val)
        head = head.next
    }
    let res = node 
    while(node){
        node.val = arr.pop()
        node = node.next
    }
    return res
}

六、相交链表,判断两个链表是否有相交之点
可以通过快慢指针,将两个链表形成一个环,不断循环,然后判断是否会相遇即可
此题解题思路一样可以用于牛客第141题环形链表,快慢指针是否会相遇来判断环形是否成立。

var getIntersectionNode = function(headA, headB) {
    let h1 = headA
    let h2 = headB
    while(h1!==h2){
          if(h1==null){
              h1 = headB
          }else{
              h1 = h1.next
          }
          if(h2==null){
              h2 = headA
          }else{
              h2 = h2.next
          }
    }
    return h1
};

七、给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序

var reverseKGroup = function(head, k) {
 let a = head, b = head;
    for (let i = 0; i < k; i++) {
        if (b == null) return head;
        b = b.next;
    }
    const newHead = reverse(a, b);
    a.next = reverseKGroup(b, k);
    return newHead;
};
function reverse(a, b) {
    let prev = null, cur = a, nxt = a;
    while (cur != b) {
        nxt = cur.next;
        cur.next = prev;
        prev = cur;
        cur = nxt;
    }
    return prev;
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:59:14  更:2021-07-30 13:00:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:23:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码