java - 在第一个位置插入元素时返回不正确的链接列表
问题描述
我是一个初学者,并且正在练习在链表中已经存在几个元素时在第一个位置插入节点的程序。这是我的代码片段
class LinkedList{
int data;
LinkedList next;
void insertNodeAtTheEnd(int d, LinkedList head){
LinkedList temp;
temp = head;
while(temp.next != null){
temp = temp.next;
}
LinkedList newNode = new LinkedList();
newNode.data = d;
newNode.next = null;
temp.next = newNode;
}
void insertNodeAtGivenPosition(int d , int pos , LinkedList head){
LinkedList temp;
temp = head;
int tempPos = 1;
LinkedList newNode = new LinkedList();
LinkedList before = temp;
if(pos == 1){
newNode.data = d;
newNode.next = temp;
temp = newNode;
}
else {
while(temp != null){
if(pos == tempPos){
newNode.data = d;
newNode.next = before.next ;
before.next = newNode;
}
before = temp ;
temp = temp.next ;
tempPos++;
}
}
}
void printLinked(LinkedList head){
LinkedList temp = head;
while(temp.next != null){
System.out.print(temp.data + "->");
temp = temp.next;
}
System.out.print(temp.data +"\n");
}
}
class LinkedListMain{
public static void main(String[] args){
LinkedList node1 = new LinkedList();
node1.data = 10;
node1.next = null;
LinkedList head;
head = node1;
head.insertNodeAtTheEnd(8, head);
head.insertNodeAtTheEnd(6, head);
head.insertNodeAtTheEnd(7, head);
head.insertNodeAtTheEnd(11, head);
head.insertNodeAtTheEnd(5, head);
head.insertNodeAtTheEnd(2, head);
head.printLinked(head);
head.insertNodeAtGivenPosition(4 , 3 , head); //line 1
head.printLinked(head);
head.insertNodeAtGivenPosition(1 , 1 , head); //line2
head.printLinked(head);
}
}
对于上面的代码,使用方法“insertNodeAtGivenPosition()”在第三个位置(第 1 行)插入元素后,代码工作正常,输出如下所示
10->8->6->7->11->5->2
10->8->4->6->7->11->5->2
但是当我尝试使用相同的逻辑在第一个位置(第 2 行)插入元素并打印列表时,第一个元素没有插入,输出看起来像
10->8->6->7->11->5->2
10->8->4->6->7->11->5->2
10->8->4->6->7->11->5->2
我究竟做错了什么?“head”的值似乎存在一些问题。
解决方案
为了在开头插入,您必须更改head
以引用新节点。但是,head
传递给您的方法,该方法无法更改它。
为了使其工作,您需要返回新的head
:
LinkedList insertNodeAtGivenPosition(int d , int pos , LinkedList head){
LinkedList temp;
temp = head;
int tempPos = 1;
LinkedList newNode = new LinkedList();
LinkedList before = temp;
if(pos == 1) {
newNode.data = d;
newNode.next = head;
head = newNode;
} else {
while(temp != null){
if(pos == tempPos){
newNode.data = d;
newNode.next = before.next;
before.next = newNode;
}
before = temp;
temp = temp.next;
tempPos++;
}
}
return head;
}
方法调用应该是:
head = head.insertNodeAtGivenPosition(1 , 1 , head);
当然,你不需要head
参数,因为它是一个实例方法,所以你可以把它改成:
LinkedList insertNodeAtGivenPosition(int d , int pos) {
LinkedList head = this;
LinkedList temp = head;
int tempPos = 1;
LinkedList newNode = new LinkedList();
LinkedList before = temp;
if(pos == 1){
newNode.data = d;
newNode.next = head;
head = newNode;
} else {
while(temp != null) {
if(pos == tempPos){
newNode.data = d;
newNode.next = before.next ;
before.next = newNode;
}
before = temp ;
temp = temp.next ;
tempPos++;
}
}
return head;
}
并调用它:
head = head.insertNodeAtGivenPosition(1 , 1);
推荐阅读
- python - 删除数据框中的“Specials Unicode”
- python - Python 代码可以包含在 NetLogo 代码的主体中吗?
- npm - 当我尝试使用静态服务器在移动设备上进行测试时,为什么无法连接到我的 WSL 控制台提供的 IP
- r - 使用 R 的页面中的多个绘图
- jquery - 当折叠元素已经显示时,Bootstrap 4展开全部/全部折叠按钮不起作用
- ios - сconstraints 在具有收藏视图的 iPad 上不起作用
- javascript - 鉴于以下代码,为什么我的 $_FILES 为空?
- azure-web-app-service - Azure Web App:为什么高级版比标准版便宜
- php - 在php中按日期(字符串)过滤和排序foreach循环
- text - 如何在星期一通过 Twilio 接收入站文本?