1.删除排序链表的重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2] 输出:[1,2] 示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
分析:判断当前节点与下一个节点值是否相等如果相等就让当前节点的next指向当前节点的下下个节点,这样相同的节点就被删掉了,如果不相等就让当前节点指向下一个节点.代码如下:
var deleteDuplicates = function(head) {
//判断当前链表是否大于两个节点
if(!head || !head.next) return head;
//定义一个变量等于当前链表
let p = head;
//循环链表
while(p.next){
//判断当前节点值与下个节点值是否相等,如果相等就等于下下个节点
if(p.val == p.next.val){
//此时链表已经改变删除了当前节点的下一个节点,此时head已改变
p.next = p.next.next;
}else{
//当前head没发生变化
p = p.next;
}
}
//返回已改变的链表
return head;
};
2.分割链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入: head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
解题思路:定义两个空链表,大于x的放在一个链表里,小于的放在一个链表,定义两个变量等于两个空节点的尾结点,操作链表的插入,然后将大于的链表拼接在小的一组链表后面,就完成了分割链表,代码如下:
var partition = function(head, x) {
//判断链表是否需要分割
if(!head || !head.next) return head;
//定义空链表存放小于x的节点
let rs = new ListNode(0);
//定义一个空链表存放大于x值的节点
let rb = new ListNode(0);
//定义变量接受链表
let rs1 = rs,rb1 = rb,p = head,q = head;
//遍历当前链表
while(p){
//储存没有遍历过的节点
q = q.next;
断开链表这样p就等于当前节点,只有一个节点
p.next = null;
if(p.val < x){
//如果小于x就存放在rs链表里
rs1.next = p;
//保持rs1等于rs链表的最后一个节点
rs1 = p;
}else{
//如果大于x就存放在rb链表里
rb1.next = p;
//保持rb1等于rb链表的最后一个节点
rb1 = p;
}
//将p赋值未遍历的节点
p = q;
}
//让rs链表的末尾节点rs1指向rb这样就完成链表拼接
rs1.next = rb.next;
return rs.next;
};