链表中结构体指针传递形参与实参之间的问题

配图随便配的,莫介意。

其中链表创建,删除,显示和C语言的过程一样。不过在重写的过程中,由于传址调用和传值调用理解的不够深刻,导致代码重新书写的过程中错误不断。从而,说明了我之前学习代码过程中不求甚解,之前由于懒惰以及其他一些主观原因,导致数据结构还没学完。这是我需要检讨的原因。之后会不断更新代码学习过程中遇到的问题。

package com.xinxiang.javase.leetcode;

import java.util.Scanner;

public class DeleteALinkedListNode {
    public static void main(String[] args) {
        ListNode h=creat();
        show(h);                 //显示链表
        dele(h);
        show(h);
    }

    private static void dele(ListNode h1) {
        if(h1==null)
            return;
        System.out.println("\n");
        System.out.println("请输入你所要删除的value:");
        Scanner in=new Scanner(System.in);
        int m=in.nextInt();

        ListNode LN1=h1;
        ListNode LN=h1.next;
        while(LN!=null){
            if(LN.val==m){
                LN1.next=LN.next;
                LN=null;
                break;
            }
            else {
                LN1=LN;
                LN=LN.next;
            }
        }
        /*第二种代码实现方式
            ListNode LN=h1;
            while(LN.next.val!=m&&LN.next!=null){
                LN=LN.next;
            }
            if(LN.next==null){
                System.out.println("链表无此值");
            }
            LN.next=LN.next.next;
        */
    }
    public static void show(ListNode node){
        if(node==null){
            System.out.println("链表数据为空!!!");
            return;
        }
        System.out.println("链表如下所示:");
        while (node.next!=null){
            System.out.print("-->"+node.next.val);
            node=node.next;
        }
    }
    public static ListNode creat(){
        ListNode L=new ListNode();
        ListNode L1=L;
        while(true){
            System.out.println("请输入节点value(以负数为结束标志):");
            Scanner s=new Scanner(System.in);
            int value=s.nextInt();
            if(value<0){
                break;
            }
            ListNode L2=new ListNode();
            L2.val=value;
            L1.next=L2;
            L1=L2;
        }
        return L;
    }

}
class ListNode {
    int val;
    ListNode next;
    public ListNode() {
    }
    public ListNode(int val) {
        this.val = val;
    }
}

由于与之前C的一致,这里具体不再赘述。

问题:问题是传值调用并不会改变原来实参的内容,可在以上过程之中实参中的内容却改变了,为啥呢?

其中原因我找到了CSDN的一位博主在关于传址调用和传值调用的“浅谈”。链接如下:

https://blog.csdn.net/m0_53380069/article/details/116244835?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167488613016800182119778%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167488613016800182119778&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-116244835-null-null.142^v71^pc_search_v2,201^v4^add_ask&utm_term=%E7%88%B1%E6%95%B0%E5%AD%A6%E7%9A%84%E4%BC%81%E9%B9%85&spm=1018.2226.3001.4187

以上内容对此理解大有裨益。有需要可以自行查询。

下面是一段关于C语言的程序,想必你知道a的值了吧。。

#include <stdio.h>

void change(int* q) {

    *q=200;
}
int main() {
    int a = 2;
    int* p = &a;
   change(p);
    printf("%d", a);
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天是蓝的嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值