反转单向链表
1.思路
因为一个链表是一个单向的,如果要反转,肯定是要遍历的,并且使链表使反转.可以在新的链表中使用头插入法,那么新链表和原链表顺序是逆向的.达到反转效果.
反转链表方法:reverseLinkList(Node head)
2.创建链表节点
public class Node {
public int value;//链表的值
public Node next;//下一节点
public Node() {
}
public Node(int value) {
this.value = value;
}
}
3.创建单向链表
/**
* 创建一个链表
*
* @return 返回链表的头节点
*/
public static Node createLinkList() {
Node header = null;
Node h = null;
//使用未插入法模拟创建一个链表
Node node;
for (int i = 0; i < 10; i++) {
node = new Node(i);
node.next = null;
if (header == null) {
header = node;
h = node;
} else {
h.next = node;
h = node;
}
}
return header;
}
0->1->2->3->4->5->6->7->8->9
4.反转链表
/**
* 反转一个链表:使用头插入法
*
* @param head 需要反转的链表
* @return 反转后的链表
*/
public static Node reverseLinkList(Node head) {
Node newHead = null;
Node temp;
while (head != null) {
//1.创建一个新节点,将值给你新的结点
temp = new Node();
temp.value = head.value;
//2.将新结点的next指向新链表的头结点
temp.next = newHead;
//3.将新链表的头结点指向新插入的结点
newHead = temp;
//4.将遍历的结点指向下一结点
head = head.next;
}
return newHead;
}
5.打印链表
/**
* 打印链表
*
* @param node
*/
public static void printLinkList(Node node) {
Node temp = node;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
boolean isFlag = false;
while (temp != null) {
if (isFlag) {
stringBuilder.append("->").append(temp.value);
} else {
stringBuilder.append(temp.value);
isFlag = true;
}
temp = temp.next;
}
stringBuilder.append("]");
System.out.println(stringBuilder.toString());
}
6.调用示例
public static void main(String[] args) {
System.out.println("-----\n");
Node head = createLinkList();
System.out.print("反转前:");
printLinkList(head);
//反转
Node reserver = reverseLinkList(head);
System.out.print("反转后:");
printLinkList(reserver);
System.out.println("\n-----");
}
7.打印结果
反转前:[0->1->2->3->4->5->6->7->8->9]
反转后:[9->8->7->6->5->4->3->2->1->0]
8.总结
本质就是利用了头插入方法插入链条,正好可以实现链条逆向.
了解单链表的操作,请查看