LeetCode--链表--不定时更新

Posted 从来不虚场合

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode--链表--不定时更新相关的知识,希望对你有一定的参考价值。

1._237_删除链表中的节点

1.1链接

https://leetcode-cn.com/problems/delete-node-in-a-linked-list/

1.2题目描述

 1.3代码实现

package 链表;

/**
 * https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
 * @author MJ Lee
 *
 */
public class _237_删除链表中的节点 {
    
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}
View Code

2._206_反转链表

2.1链接

https://leetcode-cn.com/problems/reverse-linked-list/

2.2题目描述

2.3解决思路

 

2.3.1递归方式

代码实现

 java版本

    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
    
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
View Code

 python版本

class Node(object):
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next
###递归方式
def reverse2(head):
     if head.next == None:  # 递归停止的基线条件
          return head
     new_head = reverse2(head.next)
     head.next.next = head    # 当前层函数的head节点的后续节点指向当前head节点
     head.next = None    # 当前head节点指向None
     return new_head


link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9)))))))))
root = reverse2(link)
while root:
        print(root.value)
        root =root.next
View Code

2.3.2非递归方式

代码实现 

java版本

public ListNode reverseList2(ListNode head) {
        if (head == null || head.next == null) return head;
    
        ListNode newHead = null;
        while (head != null) {
            //tmp的作用临时变了 保存变量值 防止节点引用断裂 从而被gc误删
            ListNode tmp = head.next;
            head.next = newHead;
            newHead = head;
            head = tmp;
        }
        
        return newHead;
    }
View Code

 python版本

class Node(object):
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next
###循环方式
def reverse(head):
    cur_node = head  # 当前节点
    new_link = None  # 表示反转后的链表
    while cur_node != None:
        tmp = cur_node.next  # cur_node后续节点传递给中间变量
        cur_node.next = new_link    # cur_node指向new_link
        new_link = cur_node    # 反转链表更新,cur_node为新的头结点
        cur_node = tmp    # 原链表节点后移一位
    return new_link
link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9)))))))))
root = reverse2(link)
while root:
        print(root.value)
        root =root.next
View Code

3._141_环形链表

3.1链接

https://leetcode-cn.com/problems/linked-list-cycle/

3.2题目描述

3.3解决思路

快慢指针

 

 

 

 

3.4代码实现

java版本

public class _141_环形链表 {
    
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) return false;
        
        ListNode slow = head;
        ListNode fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            
            if (slow == fast) return true;
        }
        
        return false;
    }
    
}
View Code

 

 

4.约瑟夫问题

4.1链接

https://blog.csdn.net/weixin_38214171/article/details/80352921?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

4.2题目描述

 

 

4.3解决思路

用循环链表解决

4.4代码实现

java版本

static void josephus() {
        CircleLinkedList<Integer> list = new CircleLinkedList<>();
        for (int i = 1; i <= 8; i++) {
            list.add(i);
        }
        
        // 指向头结点(指向1)
        list.reset();
        
        while (!list.isEmpty()) {
            list.next();
            list.next();
            System.out.println(list.remove());
        }
    }
View Code

 

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

X._XXX_

x.1链接

 

x.2题目描述

 

x.3解决思路

 

x.4代码实现

java版本

 

 

 

 

 

    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) return false;
        
        ListNode slow = head;
        ListNode fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            
            if (slow == fast) return true;
        }
        
        return false;
    }
View Code

以上是关于LeetCode--链表--不定时更新的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题笔记之链表篇234. 回文链表

Leetcode刷题笔记之链表篇141. 环形链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇234. 回文链表

Leetcode刷题笔记之链表篇206. 反转链表