java 链表逆序 递归,java用递归和非递归实现链表逆序

传统的逆序链表方法是使用三个指针来记录节点的状态,防止链表断裂。

6bc7a5e3f13d2b8c552a81562a39f87e.png

Node节点

public class Node {

private int data;

private Node next;

public Node(int data){

this.data = data;

next = null;

}

public int getData() {

return this.data;

}

public void setData(int data) {

this.data = data;

}

public Node getNext() {

return next;

}

public void setNext(Node next) {

this.next = next;

}

}

逆序方法

public static Node reverseLinkList(Node head){

Node p1=head,p2 = head.getNext();

Node p3=null;

while (p2!=null){

p3 = p2.getNext();

p2.setNext(p1);

p1 = p2;

p2 = p3;

}

return p1;

}

主方法里面逆序

Node newHead = reverseLinkList(head);

head.setNext(null);

p = newHead;

while (p != null) {

System.out.print(p.getData() + " ");

p = p.getNext();

}

我在想递归是先处理好后面的问题,然后把结果返回。如果我从最后开始逆序整个链表,我获得当前节点的后一个节点的时候,当前节点的后面已经完成逆序。只要将后一个节点指向当前节点。

16cd29d3c25b504b3f67021607ebeb13.png

这里使用了静态变量newHead是因为要记录旧的尾节点来作为新的头节点。不然整个函数获得的只是旧的头结点(新的尾节点)。如果将newHead作为形参传入方法,而不设置成静态变量,是不行的。因为java里面对象的引用形参相当于拷贝了一份实参。直接改变形参指向一个新的对象是不会改变实参的。而改变形参引用的内容却可以改变实参所引用对象的内容,如下面的setNext方法。

private static Node newHead;

public static Node getNextNode(Node node) {

if (node.getNext() != null) {

//获得后一个节点,此时该节点后面节点已经全部逆序完

Node nextNode = getNextNode(node.getNext());

nextNode.setNext(node);

return node;

}

//最后一个节点

else {

newHead = node;

return node;

}

}

主方法里面调用,可以发现递归来实现逆序也是可以的

Node tail = getNextNode(head);

//尾节点(原头节点)指向null

tail.setNext(null);

p = newHead;

while (p != null) {

System.out.print(p.getData() + " ");

p = p.getNext();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值