首页 > 其他分享 >链表的基本操作

链表的基本操作

时间:2023-05-04 12:36:16浏览次数:38  
标签:head ListNode list next 链表 基本操作 null

class ListNode {
  val: number
  next: ListNode | null

  constructor(val?: number, next?: ListNode | null) {
    this.val = (val === undefined ? 0 : val)
    this.next = (next === undefined ? null : next)
  }
}

/**
 * 数组转链表
 * @param arr
 * @param index
 */
function arrayToList(arr: number[], index: number): ListNode | null {
  if (arr[index]) {
    return new ListNode(arr[index], arrayToList(arr, index + 1))
  } else {
    return null
  }
}

/**
 * 遍历链表
 * @param list
 */
function ergodicList(list: ListNode | null) {
  while (list) {
    console.log(list.val)
    list = list.next
  }
}

/**
 * 反转链表
 * @param list
 */
function reverseList(list: ListNode | null): ListNode | null {
  let head = null
  while (list) {
    const next = list.next
    list.next = head
    head = list
    list = next
  }
  return head
}

/**
 * 力扣:回文链表
 * @param head
 */
function isPalindrome(head: ListNode | null): boolean {
  // 快慢指针遍历
  let fast: ListNode | null = head, slow: ListNode | null = head
  while (fast && fast.next) {
    slow = slow!.next
    fast = fast.next.next
  }
  // 反转后半部分链表
  let afterHead = reverseList(slow)
  // 遍历反转后的链表并比对
  while (afterHead) {
    if (head!.val !== afterHead!.val) {
      return false
    }
    head = head!.next
    afterHead = afterHead.next
  }
  return true
};

const list = arrayToList([], 0)

console.log(isPalindrome(list))

标签:head,ListNode,list,next,链表,基本操作,null
From: https://www.cnblogs.com/linding/p/17370817.html

相关文章

  • 链表内指定区间反转
    描述将一个节点数为size链表m 位置到 n位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。例如:给出的链表为 1→2→3→4→5→NULL, m=2,n=4,返回 1→4→3→2→5→NULL.数据范围: 链表长度 0<size≤1000,0<m≤n≤size,链表中每个节点的值满足∣val∣≤1000要......
  • 剑指 Offer II 022. 链表中环的入口节点
    题目链接:剑指OfferII022.链表中环的入口节点方法一:哈希解题思路统计走过的节点,当第一次遇到重复的节点时,即为入口节点,否则为\(null\)。代码classSolution{public:ListNode*detectCycle(ListNode*head){unordered_map<ListNode*,bool>cache;......
  • LeetCode 链表操作
    21. 合并两个有序链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.......
  • 21 文件六大基本操作
    文件的六大基本操作:新建、打开、关闭、读写、删除文件;辅助操作:操作根目录文件:操作文件,先要找到与该文件对应的rfsdir_t结构;get_rootdirfile_blk函数:获取根目录文件,先调用get_rootdir函数获取根目录的rfsdir_t结构,到一个缓冲区中;del_rootdir函数释放缓冲区;获取文件名:......
  • 反转链表
    描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0≤n≤1000要求:空间复杂度 O(1) ,时间复杂度 O(n) 。 如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。 ......
  • java反转部分链表后记
    由于链表只是一个单向链表所以不能在一次循环之内就直接进行反转操作又因为只需要反转部分链表所以只要将链表遍历到需要反转的最后一位,剩下的不用管了于是我想到了在第一遍循环中用HashMap获取需要反转的链表的部分,键代表下标,值代表原先链表中val之后第二遍遍历时按照将值按......
  • ds:单链表
    写在前边:单链表:1.带头结点的单链表:L头指针->头结点(data域不存数据元素,只指向下一个元素)->a1->a2->..->NULL2.不带头结点的单链表:L头指针->a1->a2...->NULL以上两种区别在于:无头结点的单链表在进行插入/删除元素时要对i=1的情况做特殊处理 一、带头结点的单链表基本操作#......
  • c语言实现链表的基本操作——初始化,求长度,添加节点,遍历输出
    #include<stdio.h>#include<stdlib.h>//创建结构体并命名typedefstructNode //typedef用于对struct的重命名{ inti; structNode*next;}LNode,*LinkList; //定义一个结构体指针//链表初始化boolInistList(LinkListL){ L=(LNode*)malloc(sizeof(LNo......
  • 链表
    手写双链表:#include<iostream>//链表节点结构体structListNode{intvalue;ListNode*prev;ListNode*next;ListNode(intv,ListNode*p=nullptr,ListNode*n=nullptr):value(v),prev(p),next(n){}};classLinkedList{public:Li......
  • 【数据结构】链式型存储结构-双向链表
    1 前言只要大家坐过火车,对于双向链表的理解就相当简单。双向链表就是在单链表的基础之上,为每一个结点增加了它的前继结点,我们来看看。2 双向链表双向链表的定义如下:typedefstructDaulNode{ElemTypedata;structDaulNode*prior;//前驱结点structDa......