链表的操作

单链表的操作

节点定义

class Node{
    int val;
    Node next;
}

单链表创建

private Node head = null;
int size = 0;

增加

定义个新节点,从头添加数据,注意如果为空,则赋值头结点,否则node.next指向头结点,head = ndoe。size加1

public void add(int val){
    Node node = new Node();
    node.val = val;
    if(head == null){
        head = node;
    }else {
        node.val = val;
        node.next = head;
        head = node;
    }
    size++;
}

删除

我这里单链表写的非常繁琐,所以双链表删除再祥讲

public void deleteVal(int val){
    int index = getByIndex(val);
    if(index == -1){
        return;
    }
    Node newNode = head;
    if(index == 0){
        if(size == 0){
            head.next = null;
            head = null;
            return;
        }
        head = head.next;
        newNode.next = null;
        newNode = null;
        size--;
        return;
    }
    for (int i = 0; i < index - 1; i++) {
        newNode = newNode.next;
    }
    Node newNode1 = newNode.next;
    newNode.next = newNode.next.next;
    newNode1.next = null;
    newNode1 = null;
    size--;
}

双链表的操作

双节点定义

class doubleNode{
    doubleNode prev;
    int val;
    doubleNode next;

    public doubleNode() {
    }

    public doubleNode(int val) {
        this.val = val;
    }

    public doubleNode(doubleNode prev, int val, doubleNode next) {
        this.prev = prev;
        this.val = val;
        this.next = next;
    }
}

双链表初始化及增加头结点或未节点

private int size;
private doubleNode head;
private doubleNode tail;

public void addFirst(int val){
    doubleNode node = new doubleNode(val);
    //这里注意尾节点
    if(tail == null){
        tail = node;
    }else {
        node.next = head;
        head.prev = node;
    }
    head = node;
    size++;
}

public void addlast(int val){
    doubleNode node = new doubleNode(val);
    if(head == null){
        head = node;
    }else {
        tail.next = node;
        node.prev = tail;
    }
    tail = node;
    size++;
}

根据下标返回节点

这里能迅速返回下标节点位置,更加方便实现删除和添加,修改

public doubleNode node(int index){
    if(index < 0 || index >= size){
        System.out.println("下标越界!");
        return null;
    }
    doubleNode node = head;
    if(index <= size / 2){
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
    }else{
        node = tail;
        for (int i = 0; i < size - index; i++) {
            node = node.prev;
        }
    }
    return node;
}

删除节点

这点处理好,删除操作就非常简单了

public void unlike(doubleNode node){
    //****重要****
    //这里先处理前驱和删除节点的关系,在处理后驱与删除节点的关系。先前再后的思想很重要
    doubleNode prev = node.prev;
    doubleNode cur = node.next;
    if(prev == null){
        head = cur;
    }else{
        prev.next = cur;
        node.prev = null;
    }
    if(cur == null){
        tail = prev;
    }else {
        cur.prev = prev;
        node.next = null;
    }
    size--;
}

总结

总的来说链表比较简单,只需要注意主要几个步骤(删节点,找节点位置,头部位置),其它都很简单。

再者做题的话:

1.注意数学思想,用数学思考

2.递归用的话注意最后一个要处理的节点的处理,与剩余节点关系

3.快满指针,迭代,二分法,圆圈。

4.做题边界条件极为重压,开始就要考虑空指针问题。在这里插入代码片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值