【代码随想录】链表

203. 移除链表元素

在这里插入图片描述

在这里插入图片描述

// public class ListNode {
//     int val;
//     ListNode next;
//     ListNode() {}
//     ListNode(int val) { this.val = val; }
//     ListNode(int val, ListNode next) { this.val = val; this.next = next;}
// }

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 在head之前创建一个虚拟节点
        ListNode preHead = new ListNode(0, head);
        ListNode current=preHead;
        while(current.next!=null){
            if(current.next.val == val){
                current.next=current.next.next;
            }else{
                current=current.next;
            }

        }
        return preHead.next;
    }
}

707.设计链表

在这里插入图片描述
在这里插入图片描述

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

class MyLinkedList {
    int size;
    ListNode head;

    public MyLinkedList() {
        this.size=0;
        this.head=new ListNode(0);//头节点之前的节点
    }
    
    public int get(int index) {
        if(index<0 || index>=this.size){
            return -1;
        }   

        ListNode current=this.head;
        for(int i=0;i<=index;i++){
            current=current.next;
        }
        return current.val;
    }
    
    public void addAtHead(int val) {
        addAtIndex(0, val);    
    }
    
    public void addAtTail(int val) {
        addAtIndex(this.size, val);
    }
    
    public void addAtIndex(int index, int val) {
        if(index<0 || index>this.size){
            return ;
        }
        
        ListNode node = new ListNode(val);
        ListNode current=this.head;
        for(int i=0;i<index;i++){
            current=current.next;//最终指向index的前一个节点
        }
        node.next=current.next;
        current.next=node;
        size++;//新增元素后不要忘记链表长度+1
    }
    
    public void deleteAtIndex(int index) {
        if(index<0 || index>=this.size){
            return ;
        }

        ListNode current=this.head;
        for(int i=0;i<index;i++){
            current=current.next;//最终指向index的前一个节点
        }
        current.next=current.next.next;
        size--;//删除元素后不要忘记链表长度-1
    }
}

206.反转链表

在这里插入图片描述
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode pre=new ListNode(0, head);//添加首节点
        ListNode current=head;

        while(current!=null){
            ListNode post=current.next;
            current.next=pre;
            pre=current;
            current=post;
        }
        head.next=null;//去掉首节点
        return pre;
    }
}

24. 两两交换链表中的节点

在这里插入图片描述
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }
        ListNode prehead=new ListNode(0, head);
        ListNode node1=head;
        ListNode node2=node1.next;
        ListNode pre=prehead;
        while(node1!=null && node2!=null){
            ListNode post=node2.next;
            pre.next=node2;
            node2.next=node1;
            node1.next=post;
            pre=node1;
            node1=post;
            if(node1!=null){
                node2=node1.next;
            }           
        }
        // 不能直接返回head,因为head现在指向链表的第二个元素
        return prehead.next;
    }
}

19.删除链表的倒数第 N 个节点

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 把preHead当成第0个,head当成第1个
        ListNode preHead=new ListNode(0, head);
        int length=0;
        ListNode pointer=preHead;
        while(pointer.next!=null){
            length++;
            pointer=pointer.next;
        }
        pointer=preHead;
        for(int i=1;i<length-n+1;i++){
            pointer=pointer.next;//最终指向要删除节点的前一个节点
        }
        pointer.next=pointer.next.next;

        // head节点有可能被删除了
        return preHead.next;
    }
}

160.相交链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //存放链表A各节点的地址,目的是看链表B中是否有在set集合中的节点
        Set set = new HashSet();
        ListNode pointerA=headA;
        while(pointerA!=null){
            set.add(pointerA);
            pointerA=pointerA.next;
        }
        ListNode pointerB=headB;
        while(pointerB!=null && !set.contains(pointerB)){
            pointerB=pointerB.next;
        }
        //(1)在最后一个元素之后(null处)跳出循环
        //(2)在非空元素处跳出循环
        // if(pointerB==null){
        //     return null;
        // }else{
        //     pointerB;
        // }
        return pointerB;
    }
}

另一种解法:先遍历两个链表,得到它们的长度。然后,让长链表的指针先走它们长度差的步数,接着两个指针同时向前遍历,直到它们相遇或都为 null。

142.环形链表 II

在这里插入图片描述
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        Set set=new HashSet();
        ListNode pointer=head;
        while(!set.contains(pointer) && pointer!=null){
            set.add(pointer);
            pointer=pointer.next;
        }
        //(1)链表有环:因走到已经走过的节点而退出循环
        //(2)链表无环:因走到链表末尾而退出循环
        return pointer;
    }
}

另一种解法:快慢指针

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值