代码随想录算法训练营第三天| 203. 移除链表元素、707.设计链表、 206.反转链表

9 阅读1分钟

203. 移除链表元素

相关链接: 题目链接 文章讲解 视频讲解

解题思路

链表

删除节点: node.next = node.next.next

移动指针: node = node.next

代码

var removeElements = function(head, val) {
    //这边需要使用 while 进行判断,可能是 1,1,1
    while(head!=null && head.val == val){
        head = head.next;
    }
    //cur 初始值是 head,主要是为了删除第二个元素,只需要第一个的 next 指向第三个的 next
    var cur = head;
    while(cur != null && cur.next != null){
        if(cur.next.val == val){
            cur.next = cur.next.next;
        }else{
            cur = cur.next;
        }
    }
    return head;
};

虚拟头节点

主要是使得处理头节点和其他节点的操作一致

虚拟头节点:主要用来解决在链表中添加节点和删除节点相关的问题

代码

var removeElements = function(head, val) {
    //通过在链表前面添加虚拟头节点,使得处理第一个节点和其他节点的操作一致
    var dummyhead = new ListNode();
    //将 dummyhead.next 指向 head,即在head 前添加虚拟头节点
    dummyhead.next = head;
    //cur 节点指向 dummyhead,主要是如果第一个符合的话,就直接删除第一个节点
    var cur = dummyhead;
    while(cur.next !== null){
        if(cur.next.val === val){
            cur.next = cur.next.next;
        }else{
            cur = cur.next;
        }
    }
    return dummyhead.next
};

707.设计链表

相关链接: 题目链接 文章讲解 视频讲解

206.反转链表

相关链接: 题目链接 文章讲解 视频讲解

解题思路

双指针

使用双指针解决数组翻转问题

代码

var reverseList = function(head) {
    var cur = head,
        pre = null,
        temp;
    while(cur){
        //temp 存储下一个节点的位置
        temp = cur.next;
        cur.next = pre;
        // pre 向后移动一个节点
        pre = cur;
        //cur 指向下一个节点
        cur = temp;
    }
    return pre;
};

递归解法

其实递归就是利用了双指针的解法思路

var reverse  = function(cur,pre){
    // 终止条件
    if(cur == null){
        return pre;
    }
    var temp = cur.next;
    cur.next = pre;
    return reverse(temp,cur);
}
var reverseList = function(head) {
   return  reverse(head,null);
};