


/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let pre = null
while (head) {
// 保存下一个结点
next = head.next
// 反转指针方向
head.next = pre
// 节点递增
pre = head
head = next
}
return pre
};
反转一个链表从m到n的元素。
如对于链表1->2->3->4->5->NULL,m=2,n=4。则返回链表1->4->3->2->5->NULL
var reverseBetween = function(head, m, n) {
if(m >= n) {
return head;
}
var dummy = new ListNode(0); //通过构建listNode,处理m==1的情况
dummy.next = head;
head = dummy;
// 移动head到m-1的node;
for(var i = 0; i 给出一个有序链表,删除其中所有重复元素,使得每个元素只保留一次。
给出一个链表以及一个数x,将链表重新整理,使得小于x的元素在前;大于等于x的元素在后。
给出一个链表,将链表重新整理,使得所有索引为奇数的节点排在索引为偶数的节点前面。
给出两个非空链表,表示两个非负整数。其中每一个整数的各位数字以逆序存储,返回这两个整数相加所代表的链表。
给出两个非空链表,表示两个非负整数。其中每一个整数的各位数字以顺序存储,返回这两个整数相加所代表的链表。
在链表中删除值为val的所有节点
var removeElements = function(head, val) {
if(head === null){
return head;
}
var dummy = new ListNode(-1);
dummy.next = head;
prev = dummy;
cur = head;
while(prev !== null && prev.next !== null){
// 如果当前元素等于要删除元素,删除
if(cur.val === val) {
prev.next = cur.next;
cur = prev.next;
} else {
prev = cur;
cur = cur.next;
}
}
return dummy.next;
};
给定一个有序链表,将其中有重复的元素全部删除。
merge两个有序的链表
给定一个链表,对于每两个相邻的节点,交换其位置。


var swapPairs = function(head) {
var dummy = new ListNode(0);
dummy.next = head;
var n1 = dummy;
var n2 = head;
// 确认还有节点可以交换
while(n2 !== null && n2.next !== null){
// 保存next节点,防止丢失
var nextStart = n2.next.next;
// 交换
n1.next = n2.next;
n1.next.next = n2;
n2.next = nextStart;
n1 = n2;
n2 = n2.next;
}
return dummy.next;
};
给定一个链表,每k个节点为一组,反转每一组的k个节点。k为正整数且小于等于链表长度。如果链表长度不是k的整数倍,剩余部分不需要进行反转。如:1->2->3->4->5->NULL
为一个链表进行插入排序
写一个排序算法,用0(nlogn)的时间复杂度为一个链表进行排序
归并排序
给定链表中的一个节点,删除该节点
难点:不可能拿到删除节点的前一个节点
解决思路: deleteNode = deleteNode->next, 然后删除deleteNode->next(老办法)
var deleteNode = function(node) {
if(node == null) return;
if(node.next === null){
node.val = null;
return;
}
node.val = node.next.val;
node.next = node.next.next;
};
给定一个链表,删除倒数第n个节点
解法1:先遍历一遍计算链表长度;再遍历一遍删除倒数第n个节点

var removeNthFromEnd = function(head, n) {
var n1 = new ListNode();
var n2 = new ListNode();
var dummy = n2;
n1.next = head;
n2.next = head;
// 这里判断n1是为了防止传入的n比链表总长度还要长
while(n > 0 && n1){
n1 = n1.next;
n--;
}
// 说明n确实比链表还要长。
if(n > 0){
return head;
}
// 经过上面的循环,n1和n2已经相差了n个结点
while(n1 && n1.next){
n1 = n1.next;
n2 = n2.next;
}
// 删除
n2.next = n2.next.next;
return dummy.next;
};
给定一个链表,让这个链表向右旋转k位。其中k为非负数。
如:1->2->3->4->5->NULL,k=2
给定一个链表L(0)>L(1)>L(2)>.…>L(n-1)>L(n)
将其变为L(O)>L(n)->L(1)->L(n-1)->L(2)->L(n-2)……的形式
给一个链表,判断这个链表是否为回文链表。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4650/viewspace-2814742/ ,如需转载,请注明出处,否则将追究法律责任。