反转链表的几种方式
准备
Node类(节点):
public class Node {
public String data;
public Node next;
public Node(String data) {
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"data='" + data + '\'' +
'}';
}
}
LinkedList类(链表):
public class LinkedList {
//头结点
private Node header = new Node("");
//添加节点
void add(Node newNode) {
Node temp = header;
while (true) {
if (temp.next == null) {
temp.next = newNode;
break;
}
temp = temp.next;
}
}
//遍历链表
void traverseList() {
//判断是否为空
if (header.next == null)
System.out.println("链表为空");
Node temp = header;
while (temp.next != null) {
System.out.println(temp.next.data);
temp = temp.next;
}
}
}
方法一:原地反转
void reverseList() {
if (header.next == null || header.next.next == null) {
System.out.println("不可翻转");
return;
}
Node pre = header;
Node cur = header.next;
Node temp = null;
while (cur != null) {
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
header.next.next = null;
header.next = pre;
}
方法二,新建头结点,头插法反转**
void reverseList2() {
Node newHead = new Node("");
Node cur = header.next;
Node temp;
while (cur != null) {
temp = cur.next;
cur.next = newHead.next;
newHead.next = cur;
cur = temp;
}
header.next = newHead.next;
}
方法三:利用栈,实现链表数据反转,链表不变**
public void reverseList3() {
if (header == null) {
System.out.println("链表为空");
}
Node temp = header.next;
//创建栈,用于存放遍历到的节点
Stack<Node> stack = new Stack<>();
while (temp != null) {
stack.push(temp);
temp = temp.next;
}
while (!stack.isEmpty()) {
System.out.println(stack.pop().data);
}
}