链表总结(1)

发布时间:2023年12月24日

这一章是做完了代码随想录的链表相关题目,进行总结,在这里只贴出所有题目的链接,就不贴出完整题目了。

203移除链表元素

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null)    return head;
        // 统一操作,防止head出现null值
        ListNode node = new ListNode(-1, head);  // 一定要设置一个虚拟节点,要不然就会过不了用例元素全部一致的情况
        ListNode now = node;
        ListNode cur = head;
        while(now != null) {
            if(now.val == val) {
                // 这里是关键,要去想明白其实这时候pre还在now的前一个结点那
                cur.next = now.next;
            } else {
                cur = now;
            }
            now = now.next;  //元素不断往下移动
        }
        return node.next;
    }
}

707设计链表

代码与解析

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

class MyLinkedList {
    int size;
    ListNode head;

    /**
    MyLinkedList() 初始化 MyLinkedList 对象
     */
    public MyLinkedList() {
        size = 0;
        head = new ListNode();
    }
    /**
    获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1
     */
    public int get(int index) {
        if(index < 0 || index >= size) {
            return -1;
        }
        ListNode now = head;
        for(int i = 0;i < index;i ++) {
            now = now.next;
        }
        return now.next.val;
    }
    /**
    将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点
     */
    public void addAtHead(int val) {
        addAtIndex(0, val);
    }
    /**
    一个值为 val 的节点追加到链表中作为链表的最后一个元素
     */
    public void addAtTail(int val) {
        addAtIndex(size, val);
    }
    /**
    一个值为 val 的节点插入到链表中下标为 index 的节点之前。
    如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。
    如果 index 比长度更大,该节点将 不会插入 到链表中
     */
    public void addAtIndex(int index, int val) { // 记得size
        if(index < 0)   index = 0;
        if(index > size) return; 
        size++;
        ListNode now = head;
        for(int i = 0;i < index;i ++) {
            now = now.next;
        }
        ListNode temp = new ListNode(val);
        temp.next = now.next;
        now.next = temp;
    }
    /**
    如果下标有效,则删除链表中下标为 index 的节点
     */
    public void deleteAtIndex(int index) {
        if(index < 0 || index >= size)   return;
        ListNode node = head;
        size--;
        if(size == 0)   head = head.next;
        for(int i = 0;i < index;i ++) {
            node = node.next;
        }
        ListNode temp = node.next.next;
        node.next = temp;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

206反转链表

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)   return head;
        // 这里的设置节点之类的很关键,一定要有个pre和temp去承接节点方面的东西
        ListNode cur = head;   
        ListNode pre = null;
        ListNode temp;
        while(cur != null) {
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;

    }
}

24两两交换链表

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode now = new ListNode(-1, head);
        ListNode cur = now;
        while(now.next != null && now.next.next != null) {
            ListNode a = now.next;
            ListNode b = now.next.next;
            ListNode t = b.next;
            b.next = a;
            a.next = t;
            now.next = b;
            now = a;
        }
        return cur.next;
    }
}

160相交链表

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a = headA;
        ListNode b = headB;
        while(a != b) {
            if(a != null)   a = a.next;
            else a= headB;
            if(b != null)   b = b.next;
            else b = headA;
        }
        return a;
    }
}
文章来源:https://blog.csdn.net/m0_51547272/article/details/135179339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。