单链表

一.链表定义

Java

public class ListNode {
    int val;  // 存储的元素
    ListNode next;  // 指向下个节点
    // 无参数构造
    public ListNode();
    // 参数 val 的构造
    public LisNode(int val) {
        this.val = val;
    }
    // 参数 val, node 构造
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.node = next;
    }
}

C++

struct ListNode {
    int val;  // 存储的元素
    ListNode* next;  // 指向下一个节点指针
    ListNode(int x) : val(x), next(NULL) {};  // 节点构造函数 
};

二、设计链表

707. 设计链表

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {
        this.val = val;
    }
}
class MyLinkedList {
    int size; // 链表长度
    ListNode dummy; // 定义一个虚拟头结点,便于操作
    // 初始化链表
    public MyLinkedList() {
        size = 0; // 初始长度为0
        dummy = new ListNode(0); // 虚拟节点则为第0个节点
    }
    
    public int get(int index) {
        if (index < 0 || index >= size) { // 当获取索引非法返回-1
            return -1; 
        }
        ListNode curNode = dummy; // 定义一个当前节点,从虚拟头结点开始遍历
        for (int i = 0; i <= index; i++) {
            curNode = curNode.next; // 每次往后移动一位
        }
        return curNode.val; // 当前节点则为所求节点
    }
    
    public void addAtHead(int val) {
        addAtIndex(0, val); // 相当于在虚拟节点后插入一个节点
    }
    
    public void addAtTail(int val) {
        addAtIndex(size, val); // 相当于在size这个位置插入节点
    }
    
    public void addAtIndex(int index, int val) {
        if (index > size) { // 如果超过size则不添加
            return;
        }
        if (index < 0) { // 如果小于0,则依然指在头部插入
            return;
        }
        size++; // 链表长度增加
        ListNode preNode = dummy; // 定义一个前驱节点
        for (int i = 0; i < index; i++) {
            preNode = preNode.next;
        }
        ListNode tempNode = new ListNode(val); // 定义一个中间变量节点为要插入的节点
        tempNode.next = preNode.next; // 插入节点的后继为前去的后继
        preNode.next = tempNode; // 前驱节点的后继为要插入节点
    }
    
    public void deleteAtIndex(int index) {
        if (index < 0 || index > size) { // index无效
            return;
        }
        size--; // 链表长度减少
        ListNode preNode = dummy;
        for (int i = 0; i < index; i++) { // 找到需要删除的节点前驱
            preNode = preNode.next;
        }
        preNode.next = preNode.next.next; // 将要删除节点前驱的后继指向删除节点的后继从而删除当前节点
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容