**
背景
**
链表是面试中经常被问到的面试题。原因有两方面:一是大量的基本类库设计采用了链表作为底层的数据结构,二是链表的操作能体现出一个程序员的基本功。
闲话少说,直奔主题:
输入一个链表,输出链表的反转。
例子:
输入 : 1->2->3->4->5->null
输出 : 5->4->3->2->1->null
第一步:
如图所示,初始化三个指针。cur:正在遍历节点元素的指针。prev:遍历节点元素之前的指针。next:遍历节点元素之后的指针
第二步:
(1)现将next的指针指向cur的next节点(原来next指针指向null):next = cur.next .此时next指针指向2
(2)此时cur的指向节点还是节点1,再将节点1的next的指针指向prev指向的节点:cur.next = prev. 此时cur.next指向null
(3)将prev指向的节点由节点null指向节点1:prev=cur.此时prev和cur都指向节点1
(4)将cur指向的节点由节点1指向节点2:cur = next.此时cur和next都指向节点2
第三部:
这个步骤和之前类似
.
.
.
递归循环
**
代码实现
**
/**
* author : panther
* date : 2020/4/10
*/
public class NodeLinkPractice {
public static void main(String[] args) {
Node node5 = new Node(5, null);
Node node4 = new Node(4, node5);
Node node3 = new Node(3, node4);
Node node2 = new Node(2, node3);
Node node1 = new Node(1, node2);
Node result = reverseLink(node1);
while (result!=null){
System.out.print(result.value + " ");
result = result.next;
}
System.out.println();
}
private static Node reverseLink(Node head) {
Node prev = null;
Node cur = head;
Node next = null;
while (cur != null) {
next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
class Node {
int value;
Node next;
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
}
我对此段代码记忆总结了一个巧妙的方法:2,3,4方法
2:初始化两个字段为空。分别是prev=null和next=null
3:初始化三个字段。分别是prev=null,cur=head,next=null
4:while循环中由四行代码:
分别是: next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
我不提倡背代码,但是面试时紧张的时候很容易把指针操作的思路搞乱。坚持2,3,4原则,会让你凌乱的思维重新条理。加油~