标题:Java实现链表的删除,返回被删节点
一、分析:
-
删除第i个节点
- 【传入头结点,返回被删除的节点】 (head节点指向的链表中,若只有一个节点,则删除不了该节点)
- 【传入头结点,返回头结点】,则对于删除任意的节点都可以Java两种方式实现链表的删除,返回头结点
-
注意若返回被删除节点时,【head节点指向的链表中,若只有一个节点,则删除不了该节点,(因为删除了,对实参中的节点没有影响,不会改变形参中节点head的指向)】
-
形参中head的改变不会影响实参head的改变【除非改变head对象里面的值,就会对实参产生影响】
二、过程【传入头结点,返回被删除的节点】
- 若删除的是第一个节点,
- 链表中有多个节点 【做法:将第一个节点的值与下一个节点的值交换,
return hh(head,2);
删除下一个节点(因为改变实参中head的指向对实参没有影响(除非返回head),所以只能改变形参head的指向节点的值,这样可以对实参造成影响)】 - 链表中只有这一个节点 【做不了】
- 链表中有多个节点 【做法:将第一个节点的值与下一个节点的值交换,
- 若删除的是其它节点
public ListNode hh(ListNode head,int n) {
if(head==null) {
return null;
}
if(n<1) {
return null;
}
//判断是否是删除第一个元素 【节点个数>=2的情况】,若为1,则做不了(因为不能返回head)
if(1==n) {
// ListNode del=head;
// head=head.next; //改变不了main种的head,head引用仍旧指向之前的,对象,
// return del; //改变的只是此方法种传入的head,
//做法:改变值
int temp=head.val;
head.val=head.next.val;
head.next.val=temp;
return hh(head,2);
}
int count=1;
ListNode p=head;
ListNode l=head;
while(count<n && p!=null) {
l=p;
p=p.next;
count++;
}
ListNode s=p;
if(p!=null) {
l.next=p.next;
}
return s;
}
完整代码如下:
/**
* 删除第i个节点【传入头结点,返回被删除的节点】 (head节点指向的链表中,若只有一个节点,则删除不了该节点)
* 【传入头结点,返回头结点,则对于删除任意的节点都可以】
*
* 注意若返回被删除节点时,【head节点指向的链表中,若只有一个节点,则删除不了该节点,(因为删除了,对实参中的节点没有影响,不会改变形参中节点的指向)】
* 形参中head的改变不会影响实参head的改变【除非改变head对象里面的值,就会对实参产生影响】
@author dell
*
*/
public class DeleteINode {
public ListNode hh(ListNode head,int n) {
if(head==null) {
return null;
}
if(n<1) {
return null;
}
//判断是否是删除第一个元素 【节点个数>=2的情况】,若为1,则做不了(因为不能返回head)
if(1==n) {
// ListNode del=head;
// head=head.next; //改变不了main种的head,head引用仍旧指向之前的,对象,
// return del; //改变的只是此方法种传入的head,
//做法:改变值
int temp=head.val;
head.val=head.next.val;
head.next.val=temp;
return hh(head,2);
}
int count=1;
ListNode p=head;
ListNode l=head;
while(count<n && p!=null) {
l=p;
p=p.next;
count++;
}
ListNode s=p;
if(p!=null) {
l.next=p.next;
}
return s;
}
public void printAll(ListNode head) {
if(head==null) {
return ;
}else {
System.out.print(head.val+" ");
this.printAll(head.next);
}
}
@Test
public void test() {
ListNode a1 = new ListNode(1);
ListNode a2 = new ListNode(2);
ListNode a3 = new ListNode(4);
ListNode a4 = new ListNode(5);
ListNode a5 = new ListNode(6);
a1.next=a2;
a2.next=a3;
a3.next=a4;
a4.next=a5;
System.out.println("输出所有节点");
this.printAll(a1);
int n=1;
ListNode hh = this.hh(a1, n);
System.out.println();
System.out.println("删除的节点为"+hh==null? null:hh.val);
this.printAll(a1);
}
}