class08

这篇博客深入探讨了链表问题,包括使用快慢指针寻找链表中点,判断单链表是否为回文,按特定值划分链表,复制链表以及解决单链表相交问题。每个主题都提供了思路分析和编码实现。
摘要由CSDN通过智能技术生成

一、链表问题

1)使用容器(哈希表,数组等)
2)快慢指针
1、快慢指针

技巧:

慢指针:head、head.next
快指针:head.next、head.next.next 
快慢指针的组合:四种情况,如下四类题目    
public static class Node {
    
    public int value;
    public Node next;
    public Node(int v) {
    
        value = v;
    }
}
  • 输入链表头节点,奇数长度返回中点,偶数长度返回上中点
// head.next + head.next.next
// head 头
public static Node midOrUpMidNode(Node head) {
    
    // 空链表 or 1个结点的链表 or 2个结点的链表,返回头
    if (head == null || head.next == null || head.next.next == null) {
    
        return head;
    }
    // 链表有3个点或以上
    Node slow = head.next;
    Node fast = head.next.next;
    // 快慢指针,慢指针一次走一步,快指针一次走两步
    while (fast.next != null && fast.next.next != null) {
    
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}
  • 输入链表头节点,奇数长度返回中点,偶数长度返回下中点
// head.next + head.next
public static Node midOrDownMidNode(Node head) {
    
    if (head == null || head.next == null) {
    
        return head;
    }
    Node slow = head.next;
    Node fast = head.next;
    while (fast.next != null && fast.next.next != null) {
    
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}
  • 输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个
// head + head.next.next
public static Node midOrUpMidPreNode(Node head) {
    
    if (head == null || head.next == null || head.next.next == null) {
    
        return null;
    }
    Node slow = head;
    Node fast = head.next.next;
    while (fast.next != null && fast.next.next != null) {
    
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}
  • 输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个
// head + head.next
public static Node midOrDownMidPreNode(Node head) {
    
    if (head == null || head.next == null) {
    
        return null;
    }
    if (head.next.next == null) {
    
        return head;
    }
    Node slow = head;
    Node fast = head.next;
    while (fast.next != null && fast.next.next != null) {
    
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}
2、判断单链表是否为回文

思路:

1)栈法 -> 全部入栈,出栈与链表遍历同时对比
2)改链表 : a -> b -> c -> d -> e
		    a -> b -> c <- d <- e
	快慢指针找到中点 和 R

编码:

public static class Node {
    
    public int value;
    public Node next;
    public Node(int data) {
    
        this.value = data;
    }
}
// 栈法
// need n extra space
public static boolean isPalindrome1(Node head) {
    
    Stack<Node> stack = new Stack<Node>();
    Node cur = head;
    while (cur != null) {
    
        stack.push(cur);
        cur = cur.next;
    }
    while (head != null) {
    
        if (head.value != stack.pop().value) {
    
            return false;
        }
        head = head.next;
    }
    return true;
}
// 链表反转法 1
// need n/2 extra space
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python 中,也是对象,因此它们可以拥有元数据(metadata)。元数据是描述数据的数据,例如的名称、文档字符串、属性、方法等。 以下是一些常见的获取元数据的方法: 1. `__name__` 属性:获取的名称。 ```python class MyClass: pass print(MyClass.__name__) # 输出 MyClass ``` 2. `__doc__` 属性:获取的文档字符串。 ```python class MyClass: """This is a docstring for MyClass.""" print(MyClass.__doc__) # 输出 This is a docstring for MyClass. ``` 3. `__dict__` 属性:获取的属性和方法字典。 ```python class MyClass: x = 10 def my_method(self): pass print(MyClass.__dict__) # 输出 {'__module__': '__main__', 'x': 10, 'my_method': <function MyClass.my_method at 0x7f7c9c9b1d08>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None} ``` 4. `dir()` 函数:获取的属性和方法列表。 ```python class MyClass: x = 10 def my_method(self): pass print(dir(MyClass)) # 输出 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'my_method', 'x'] ``` 需要注意的是,以上方法获取到的元数据可能会受到继承、动态修改等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值