反转链表

339 阅读1分钟

给定一个单链表的头结点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
    }