配图随便配的,莫介意。
其中链表创建,删除,显示和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;
}