反转链表就是更改链表的当前节点和下一个节点的指向,例如:1->2->3 反转以后就是3->2->1,我们采用遍历法做题分析,步骤如下:
- 保存cur节点的next域(下一个节点),如果不保存,直接更改那么后面就找不到这个next节点了。
- 修改next节点的指向,指向cur。
- 遍历下一个节点,重复上面的操作。 对应的java实现方式如下:
public Node reverseLink(Node head){
if(head == null)return;
Node pre = head;
Node cur = head.next;
Node tmp;
while (cur != null){
//保存next域
tmp = cur.next;
//修改next的指向
cur.next = pre;
//遍历下一个节点
pre = cur;
cur = tmp;
}
// 最后旧链表的next域设为null
head.next = null;
return pre;
}
/**
* data 代表当前节点的值
* next 代表下一个节点
* */
public class Node {
public Node next = null;
public int data;
public Node(int data){
this.data = data;
}
}
有部分同学在早期没有敲过完整的链表,只看片段,有时候很难理解,这里我补充详细一点,直接可以复制运行:
public class LinkTest{
/**
* 向链表中加入节点,添加节点是在最尾部加,也就是新建链表
* */
public void addNode(int data){
Node newNode = new Node(data);
if (head == null){
head = newNode;
return;
}
Node tmp = head;
//查找最后一个节点
while (tmp.next != null){
tmp = tmp.next;
}
tmp.next = newNode;
}
}
public class Main {
public static void main(String[] args){
operateLink();
}
private static void operateLink() {
LinkTest linkTest = new LinkTest();
for (int i = 1; i < 7; i++){
linkTest.addNode(i);
}
linkTest.reverseLink(linkTest.head);
}
好了,代码看上去很简单,但是理解起来不是那么容易,链表的题目读者最好是在草稿纸上画画图,这样思路会更加清晰。
ps:如果对您有帮助,麻烦点个赞,谢谢您的阅读。