给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
简单回顾一下链表知识
-
如何实现一个链表
class LinkedList{ constructor( ){ this.count=0 //定义链表中存储元素的数量 this.head=undefined //数据结构是动态的,将第一个元素的引用保存下来 } } //为表示链表中的元素,还需要一个助手类 Node, 它表示我们想要添加到链表中的项 class Node{ constructor(element){ this.element=element this.next=undefined //node实例被创建时,它的next指针总是undefined } }
链表方法
-
向链表尾部添加一个新元素
push(ele){ let current=new Node(ele) if(!this.head){ this.head=current }else{ let temp=this.head while(temp.next){ temp=temp.next } temp.next=current } this.count++ }
-
从链表中移除元素
remove(idx){ if(idx>=0&&idx<this.count){ let pre; let current =this.head if(idx==0){ this.head=current.next }else{ let temp=this.head for(var i=0;i<idx;i++){ pre=current current=current.next } pre.next=current.next } this.count-- return current } return undefined }
-
获取元素
getElementByIdx(idx){ if(idx>=0&&idx<this.count){ let current=this.head for(let i=0;i<idx;i++){ current=current.next } return current }else{ return undefined } }
-
在任意位置插入元素
insert(ele,idx){ let node = new Node(ele) if(idx>=0&&idx<this.count){ if(idx==0){ let temp=this.head this.head=node this.head.next=temp }else{ //获取到插入位置的元素 以及插入位置后一位的元素 let current=this.getElementByIdx(idx-1) console.log(current); let temp=current.next current.next=node node.next=temp } } this.count++ }
反转链表 :
reverse(){
if(!this.head) return
let current=this.head
let temp;
let pre;
while(current){
temp=current.next
current.next=pre
pre=current
current=temp
}
return pre
}