LeetCode上一些关于链表的热门算法操作

一、LC141 是否有环结构

public boolean hasCycle(ListNode head) {
    
    
        Set<ListNode> set = new HashSet<>();
        while (head != null) {
    
    
            //如果重复出现说明有环
            if (set.contains(head))
                return true;
            //否则就把当前节点加入到集合中
            set.add(head);
            head = head.next;
        }
        return false;
    }

二、LC234 是否为回文链表

public boolean isPalindrome(ListNode head) {
    
    
        ListNode node1 = head;
        ListNode node2 = head;
        Stack<Integer> stack = new Stack<>();
        
        while(node1 != null) {
    
    
            stack.push(node1.val);
            node1 = node1.next;
        }
        
        while(node2 != null) {
    
    
            if(node2.val == stack.peek()) {
    
    
                stack.pop();
            } else {
    
    
                return false;
            }
            node2 = node2.next;
        }
        return true;
    }

三、LC21 合并两个有序链表

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
        if (l1 == null){
    
    
            return l2;
        }else if(l2 == null){
    
    
            return l1;
        }else if (l1.val < l2.val) {
    
    
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
    
    
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

四、LC83 删除链表中的重复元素

public ListNode deleteDuplicates(ListNode head) {
    
    
        if (head == null) return head;

        while(head.next != null){
    
    
            if (head.val == head.next.val){
    
    
                head.next = head.next.next;
            }else {
    
    
                head = head.next;
            }
        }

        return head;

    }

五、LC203 移除链表元素

public ListNode removeElements2(ListNode head, int val) {
    
    
        while (head != null && head.val == val) {
    
    
            head = head.next;
        }

        ListNode prev = head;

        if (prev != null)
        {
    
    
            while (prev.next != null)
            {
    
    
                if (prev.next.val == val)
                    prev.next = prev.next.next;
                else
                    prev = prev.next;
            }
        }

        return head;
    }

六、LC206 反转链表

public ListNode reverseList(ListNode head) {
    
    
        if (head == null || head.next == null) return head;

        ListNode node = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return node;
    }

七、Offer22 返回链表倒数第K个元素

class Solution {
    
    
    public int kthToLast(ListNode head, int k) {
    
    
        List<Integer> list = new ArrayList<>();
        while (head != null) {
    
    
            list.add(head.val);
            head = head.next;
        }
        return list.get(list.size() - k);
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wyn_365/article/details/119670580