5定义一个JS函数,反转单向链表

Posted 天界程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5定义一个JS函数,反转单向链表相关的知识,希望对你有一定的参考价值。

链表

  • 链表是一种物理结构(非逻辑结构),类似数组
  • 数组需要一段连续的内存空间,而链表试试零散的
  • 链表节点的数据结构value, next?, prev?

链表 VS 数组

  • 都是有序结构
  • 链表:查询慢 O(n), 新增和删除快O(1)
  • 数组:查询快O(1),新增和删除慢O(n)

创建链表代码示例

interface ILinkNode 
  value: number
  next?: ILinkNode


function createLinkNode (arr: number[]): ILinkNode 
  const len = arr.length
  if (len === 0) throw Error('this is a empty array');

  let curNode:ILinkNode = 
    value: arr[len-1]
  

  if (len === 1) return curNode;

  for(let i = len -2; i >= 0; i--)
    curNode = 
      value: arr[i],
      next: curNode
    
  

  return curNode

解题思路

  • 反转,即节点next指向前一个节点
  • 但这很容易造成nextNode 的丢失
  • 需要三个指针 prevNode curNode nextNode

反转单向链表代码示例

function reverseLinkNode (linkNode:ILinkNode):ILinkNode 
  // 定义3个指针
  let prevNode: ILinkNode | undefined
  let curNode: ILinkNode | undefined
  let nextNode: ILinkNode | undefined = linkNode

  // 以nextNode为主,遍历链表
  while (nextNode) 
    // 删除第一个元素的next,防止循环引用
    if(curNode && !prevNode) 
     delete curNode.next
    

    // 反转指针
    if (curNode && prevNode) 
      curNode.next = prevNode
    

    // 整体向后移动
    prevNode = curNode
    curNode = nextNode
    nextNode = (nextNode as ILinkNode)?.next
  
  // 最后一个补充:当nextNode为空时,curNode没有next时,设置next指向prevNode
  curNode!.next = prevNode

return curNode!

功能测试

const arr = [100,200,300]
const link = createLinkNode(arr)
console.log(link)
/*

  "value": 100,
  "next": 
    "value": 200,
    "next": 
      "value": 300
    
  

*/
console.log(reverseLinkNode(link))
/*

  "value": 300,
  "next": 
    "value": 200,
    "next": 
      "value": 100
    
  
 
*/

能够跟据数组创建一个完整的单向链表,且反转单向链表功能正常。

单元测试

describe('反转链表', () => 
	it('单个元素', () => 
        const node =  value: 100
        const node1:ILinkNode = reverseLinkNode(node)
        expect(node1).toEqual( value: 100)
    )
	
    it('多个元素', () => 
        const arr = [100, 200, 300]
        const node:ILinkNode = createLinkNode(arr)
        const node1:ILinkNode = reverseLinkNode(node)
        expcet(node1).toEqual(
            value: 300,
            next: 
                value: 200,
                next: 
                    value: 100
                
            
        )
    )
)

以上是关于5定义一个JS函数,反转单向链表的主要内容,如果未能解决你的问题,请参考以下文章

79 - 反转单向链表

2.5 反转部分单向链表

反转链表

反转单向链表

数据结构:单向链表系列8--反转链表

[算法]反转单向链表和双向链表