java和c++的链表操作

java和c++链表的表示以及基本操作
c++单链表的表示
struct Node{
    int value;  //表示这个节点的值
    Node *next; //表示下一个节点的指针
}a[200000], *head, *tail;

//定义了20万个节点,头指针和尾指针;
int index = 0;//用来表示当前节点用到了哪里
c++单链表的添加
void addFirst(int x){//如果头指针为空,也就是上面的head为空,则调用这个方法
	a[index].value = x;
    head = &a[index];  //因为head为指针,所以要用地址符号。
    tail = &a[index];
    index++;
}

void addToHead(int x){ //添加在最前面
    a[index].value = x;
    a[index].next = head; //当前节点的下一个节点修改为头节点
    head = &a[index]; //头节点修改为当前节点
    index++;
}

void addToTail(int x){//添加在最后面
    a[index].value = x;
    tail->next = &a[index]; //尾巴的下一个为a[index],因为tail是指针,所以要用箭头
    tail = &a[index];       //修改尾巴为当前节点;
    index++;
    
}

void add(int x, Node node){ //在node节点后面添加一个节点x
    a[index].value = x;
    a[index].next = node.next; //先增加一条线,也就是先让当前节点指向node的下一个节点
    node.next = &a[index];     //在让node的下一个为当前添加节点。
}
c++单链表的删除
void delete(Node *node){ //删除node节点,参数为Node node 也就是调用方法时要用delete(a[i]), 如果为*node,就是delete(&a[i]),此处为*node
    if(head == node){ //如果为头节点,就不用管之前的
        head = head->next;
    }
    else{
        //先找到删除节点的前一个节点, 可以在结构体里面定义一个pre指针,这样可以O(1)删除
        //接下来的方法是遍历方法找到该节点的前一个,复杂度为O(n);
        Node *h = head;
        while(h != null && h -> next != node){
            h = h -> next
        }
        h->next = h->next->next;//直接让当前节点的下一个,为当前节点下一个的下一个;
    }
}
c++循环单链表

循环单链表就是让尾指针指向头指针,每次执行玩操作后,让tail的下一个为head

循环单链表的好处是从任何一个节点出发都可以遍历整个链表

c++双链表

c++双链表就是可以快速的找到当前节点的前一个元素,定义结构体时,添加一个pre指针

添加或者删除时要注意先连线,在断线

list为stl中的链表,可以参考文档来学习

如果想看双链表具体的执行,可以私信我,我来更新

java单链表的定义
class Node{   //如果是做题用,可以把这个类定义为静态类
    public int value;
    public Node next;
    public Node(int value){
        this.value = value; 
    }
}
//定义头和尾
Node head = null;
Node tail = null;
java单链表的添加
public void addFirst(int x){ //如果头为空,说明当前链表为空,也就是第一次添加数据到链表
    Node cur = new Node(x); //定义当前节点
    head = cur;
    tail = cur; //添加完后,头和尾都是这个节点
}

public void addTail(int x){//添加到最后一个
    Node cur = new Node(x);
    Tail.next = cur;
    Tail = cur;
}

public void addHead(int x){
    Node cur = new Node(x);
    cur.next = head;
    head = cur;
}
public void add(int x, Node node){
    Node cur = new Node(x);
    cur.next = node.next;
    node.next = cur;
}
java单链表的删除
public deleteHead(){ //删除第一个
 	head = head.next;   
}
public delete(Node node){
    //同c++,得先找到它的上一个节点, 如果定义的不是双链表,则这个操作为O(n);
    Node h = head;
    while(h.next != node){
        h = h.next;
    }
    h.next = h.next.next; //也可为h.next = node.next;
}
java循环单链表

每次执行完添加或者操作之后,让尾指针的next = 头指针, tail.next = head

java双链表

双链表的好处就是可以更快的找到当前节点的前一个节点,表示的话多了一个pre指针(java可能不叫指针)

添加或者删除时要注意先连线,在断线

LinkedList为Java jdk中提供的链表,可以参考文档来学习

如果想看双链表具体的执行,可以私信我,我来更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值