链表篇--移除链表元素与反转链表

106 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

1.题目一

203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。  

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1 输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7 输出:[]


思路

思路:链表常规解题法,创建dummy指针(题解中的cur),通过判断当前指针的下一节点的值是否为val解题: 如果为val,那么将当前指针的下一指针指向当前指针的下一指针的下一指针cur.next = cur.next.next,否则,正常指向当前指针的下一指针cur = cur.next。


代码

将当前指针的下一指针指向当前指针的下一指针的下一指针cur.next = cur.next.next
var removeElements = function(head, val) {
    let fastHead = new ListNode()
    fastHead.next = head;
    let fast = head;
    let low = fastHead
    while(fast.next) {
        if(fast.val === val) {
            fast = fast.next;
            low.next = fast;
        }
        low = fast;
        fast = fast.next
    }
    return fastHead.next
};

1.题目二

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。  

示例 1:

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2] 输出:[2,1]

示例 3:

输入:head = [] 输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

思路

定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。 每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转 局部反转完成之后,prepre 和 curcur 同时往前移动一个位置 循环上述过程,直至 prepre 到达链表尾部


代码

定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。
每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转
局部反转完成之后,prepre 和 curcur 同时往前移动一个位置
var reverseList = function(head) {
    let pre = null;
    let cur = head;
    while(cur) {
        temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    return pre
};