收藏此站 联系我们 网站
当前位置:首页» 公司新闻 » 【建站服务】新安网站制作【新安网站优化】新安建网站、新安微信公众号运营、新安网页设计、新安微信小程序商城-域名申请

【建站服务】新安网站制作【新安网站优化】新安建网站、新安微信公众号运营、新安网页设计、新安微信小程序商城-域名申请

作者: 风兰 . 阅读量: 2 . 发表时间:2022-09-20 15:33:46

网站建设

上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


新安网站制作【新安网站优化】新安建网站、新安微信公众号运营、新安网页设计、新安微信小程序商城


新安县位于河南省洛阳市西部,地处北纬34°36′至北纬35°05′,东经111°53′至112°19′之间。北临黄河,与济源市及山西省垣曲县隔河相望;南与宜阳县接壤;西与渑池县及义马市为邻;东与洛阳市孟津区等 [27]  毗连。

新安历为十三朝古都洛阳畿地和西方门户,地扼函关古道,东连郑汴,西通长安,自古为中原要塞,军事重地。当代,陇海铁路及310国道、连霍高速公路横贯东西,更成为连接祖国西北、华东及华北间的重要通道。

新安不仅是河南省48个扩权县和50个对外开放重点县之一,也被誉为中西部地区发展潜力最大、最具活力的县市之一。 [1]  2020年7月29日,入选2019年重新确认国家卫生乡镇(县城)名单。 [2]  2020年11月,入选第六届全国文明城市 [3]  。

2020年11月,入选 “2020年中国工业百强县(市)”,排名第84位。 [4]  11月27日,被评为省级森林城市 [5]  。

2020年,新安县完成地区生产总值530亿元,同比增长4%,一般公共预算收入28.14亿元,同比增长5.9%;规模以上工业增加值同比增长4.7%;固定资产投资同比增长7.1%;社会消费品零售总额完成112.4亿元;城乡居民人均可支配收入分别达到38312元、18596元。 [29] 


第六章:链表

6.1 链表概述(LinkedList)

链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称为指针或链接)组成。下图讲解:


相对于传统的数组,链表的一个好处在于,添加或移除元素的时候不需要移动其他元素。然而,链表需要使用指针,因此实现链表的时候需要注意。数组的另一个细节是可以直接访问任何位置元素,而要想访问链表中间的一个元素,需要从起点(表头)开始送达列表直到找到所需要元素。


现实实例就是火车,火车有多节车厢相互衔接,通过接轨来链接火车。车厢就是链表的元素,而接轨就是指针。



6.2 创建链表

function LinkedList() {

    var Node = function (val) {       //新元素构造

        this.val = val;

        this.next = null;

    };

    var length = 0;

    var head = null;

 

    this.append = function (val) {

        var node = new Node(val);       //构造新的元素节点

        var current;

        if (head === null) {        //头节点为空时  当前结点作为头节点

            head = node;

        } else {

            current = head;              

            while (current.next) {     //遍历,直到节点的next为null时停止循环,当前节点为尾节点

                current = current.next;

            }

            current.next = node;      //将尾节点指向新的元素,新元素作为尾节点

        }           

        length++;              //更新链表长度

    };

    this.removeAt = function (position) {

        if (position > -1 && position < length) {

            var current = head;

            var index = 0;

            var previous;

            if (position == 0) {

                head = current.next;

            } else {

                while (index++ < position) {

                    previous = current;

                    current = current.next;

                }

                previous.next = current.next;

            }

            length--;

            return current.val;

        } else {

            return null;

        }

    };

    this.insert = function (position, val) {

        if (position > -1 && position <= length) {   //校验边界

            var node = new Node(val);        

            current = head;

            var index = 0;

            var previous;

            if (position == 0) {       //作为头节点,将新节点的next指向原有的头节点。

                node.next = current;

                head = node;         //新节点赋值给头节点

            } else {

                while (index++ < position) {

                    previous = current;

                    current = current.next;

                }               //遍历结束得到当前position所在的current节点,和上一个节点

                previous.next = node;    //上一个节点的next指向新节点  新节点指向当前结点,可以参照上图来看

                node.next = current;

            }

            length++;

            return true;

        } else {

            return false;

        }

    };

    this.toString = function () {

        var string = head.val;

        var current = head.next;        

        while (current) {

            string += ',' + current.val;

            current = current.next;

        }

        return string;

    };

    this.indexOf = function (val) {

        var current = head;

        var index = -1;

        while (current) {

            if (val === current.val) { //从头节点开始遍历

                return index;

            }

            index++;

            current = current.next;

        }

        return -1;

    };

    this.getLength = function () {

        return length;

    }

    this.getHead = function () {

        return head;

    }

}

 

// 创建链表

var li = new LinkedList();

li.append(1);

li.append(2);

li.append(4);

li.append(4);

li.append(5);

li.insert(2,3);

li.insert(2,3);

console.log(li.toString())  // 1,2,3,3,4,4,5

console.log(li.getHead())   // 1->2->3->3->4->4->5


参考链接:

【数据结构】如何在JS中创建一个链表


6.3 双向链表

双向列表和普通列表的区别在于:

在单向列表中一个节点只有链向下一个节点的链接,而在双向列表中,链接是双向的一个链接向下一个元素,另一个链向前一个元素。


双向链表:既可以从头遍历到尾,又可以从尾遍历到头。也就是说链表连接的过程是双向的,它的实现原理是:一个节点既有向前连接的引用,也有一个向后连接的引用。

双向链表的缺点:

每次在插入或删除某个节点时,都需要处理四个引用,而不是两个,实现起来会困难些;

相对于单向链表,所占内存空间更大一些;

但是,相对于双向链表的便利性而言,这些缺点微不足道。


如图所示:


代码实现:


//先创建双向链表类DoubleLinklist,并添加基本属性,再实现双向链表的常用方法:

 //封装双向链表类

    function DoubleLinklist(){

      //封装内部类:节点类

      function Node(data){

        this.data = data

        this.prev = null

        this.next = null

      }

 

      //属性

      this.head = null

      this.tail ==null

      this.length = 0

      }



6.4 循环链表

双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。


双向链表中头节点的prev指针指向尾节点,尾节点的next指针指向头节点。


循环列表的实现:

1、创建双向循环链表


function DoublyCircularLinkedList(){

function Node(element){

this.element=element

this.next=null

this.prev=null

}

let length=0

let head=null

let tail=null

}



2、尾部插入新节点


this.append=function(element){

let node = new Node(element)

let current // 当前节点

let previous // 前一个节点

if(!head){

head=node

tail=node

head.prev=tail

tail.next=head

}else{

current=head

while(current.next !== head){

previous = current

current = current.next

}

current.next=node

node.next=head

node.prev=current

}

length++

return true

}



3、任意位置插入节点


// 在任意位置插入一个节点

this.insert=function(position,element){

if(position > 0 && position <= length){

let node = new Node(element)

let index = 0

let current = head

let previous

if(position === 0){ // 头部插入

if(!head){

node.next=node

node.prev=node

head=node

tail=node

}else{

current.prev=node

node.next=current

}

}else if(position === length){ // 在尾部插入

current=tail

current.next=node

node.prev=current

tail=node

node.next=head

}else{

while(index++ < position){

previous=current

current=current.next

}

current.prev=node

node.next=current

previous.next=node

node.prev=previous

}

length++

return true

}else{

return false

}

}



4、根据位置删除节点


this.removeAt = function(position){ 

    if(position > -1 && position < length){   

      let current = head

      let index = 0

      let previous; 

      if(position === 0){   

        current.next.previous = tail

        head = current.next;   

      }else if(position === length - 1){   

        current = tail;  

        current.prev.next = head

        head.prev = current.prev

        tail = current.prev

      }else{ 

        while(index++ < position){ 

          previous = current

          current = current.next

        } 

        previous.next = current.next

        current.next.prev = previous

      } 

      length--

      return true

    }else{ 

      return false

    } 

  }



5、根据节点值删除节点


this.remove = function(element){ 

  let current = head

  let  previous

  let  indexCheck = 0  

  while(current && indexCheck < length){ 

if(current.element === element){ 

  if(indexCheck === 0){ 

current.next.prev = tail; 

head = current.next

  }else{ 

current.next.prev = previous

previous.next = current.next

  } 

  length--

  return true

}     

previous = current

current = current.next

indexCheck++

  }    

  return false

}



6.5 有序链表

有序链表是指保持元素有序的链表结构,除了使用排序算法之外,我们还可以将元素插入到正确的位置来保证链表的有序性。

代码实现:


const Compare = {

    LESS_THAN:-1,

    BIGGER_THAN:1

};

function defaultCompare(a,b){

    if(a === b){

        return 0;

    }

    return a < b?Compare.LESS_THAN : Compare.BIGGER_THAN;

}

class SortedLinkedList extends LinkedList{//LinkedList这个类可以见https://www.cnblogs.com/MySweetheart/p/13212220.html

    constructor(equalsFn = defaultEquals, compareFn = defaultCompare){

        super(equalsFn);

        this.compareFn = compareFn;

    }

    insert(element,index = 0){

        if(this.isEmpty()){

            return super.insert(element,0);

        }

        const pos = this.getIndexNextSortedElement(element);

        return super.insert(element,pos);

    }

    getIndexNextSortedElement(element){

        let current = this.head;

        let i = 0;

        for(;i < this.size() && current; i++){

            const comp = this.compareFn(element,current.element);

            if(comp == Compare.LESS_THAN){

                return i;

            }

            current = current.next;

        }

        return i;

    }

}

微信图片_20210425092605.jpg

新安网站制作新安网站优化新安建网站、新安微信公众号运营、新安网页设计、新安微信小程序商城


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站

全国服务热线
18114747181
二维码
手机端二维码
上往建站
地址:全国各地都有驻点商务 |  网站建设上往建站
在线咨询QQ:1120768800
 
QQ在线咨询
售前咨询热线
18114747181
营销顾问
营销顾问
售后服务热线
400-000-1116
售后服务
售后服务