题目:假设有序链表为其链结点是按照数据域值的大小从小到大非递减链接的一个链表,则要求在有序链表中插入一个新的链结点以后仍然保持链表为有序链表。
解题思路:首先为被插入的数据元素申请一个新的链结点,然后从链表的第1个链结点开始顺序查找插入位置,在查找过程中需要保存当前连接点的直接前驱结点的位置,以便在插入新的链结点时使用。
具体算法实现如下:
function insertList5(list, item) {
let p, q, r
p = new Node(item, null)
if ( list == null || item < list.data) { //若链表为空或者item小于第1个链结点
p.link = list
list = p
} else {
q = list
while ( q!=null && item >= q.data) { //寻找插入位置
r = q
q = q.link
}
p.link = q
r.link = p
}
return list
}
//创建一个按值有序排列的线性链表
function createLinklist1(n) {
let p, r, list = null
let a , i
for ( i=1; i<=n; i++) {
a = i*2 //获取一个数据元素
p = new Node(a, null) //申请一个新的链结点,data赋值,指针域置空
if (list==null) {
list = p
} else {
r.link = p
}
r = p
}
return list
}
var list = createLinklist1(10)
console.log('创建的list为:', toString(list))
var r_list = insertList5(list, 13)
console.log('插入item后的链表为:', toString(r_list))