算法思想:为了实现链表的反转,需要调整指针的指向,然后找到反转后链表的头结点。下面使用非递归的方法实现链表的反转。
/*
* 如何实现链表反转
*/
//定义结点类,存储结点信息
class Node{
Node next = null;
int data;
public Node(int data) {
this.data = data;
}
}
public class LinkedList {
Node head = null;//链表头的引用
/**
* 向链表尾插入数据
* @param d:插入数据的内容
*/
public void addNode(int d) {
Node newNode = new Node(d);
if(head == null) {//链表为空
head = newNode;
return;
}
Node temp = head;
while(temp.next != null) {//遍历到链表末尾
temp = temp.next;
}
temp.next = newNode;
}
/**
* 输出当前链表的数据
*/
public void printList() {
Node temp = head;
while(temp != null) {
System.out.println(temp.data);
temp = temp.next;
}
}
/**
* 从头到尾依次反转链表
* @param head
*/
public void Reverse(Node head) {
Node pReversedHead = head;//反转之后的头指针
Node pNode = head;
Node pPrev = null;
while(pNode != null) {//如果链表不为空
Node pNext = pNode.next;
if(pNext == null) {
//如果pNext指向空,意味着pNode指向最后一个元素,因此反转后的链表头指向pNode
pReversedHead = pNode;
}
pNode.next = pPrev;//指针反转
pPrev = pNode;
pNode = pNext;//pNode后移
}
this.head = pReversedHead;
}
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.addNode(4);
list.addNode(5);
System.out.println("反转前链表序列为:");
list.printList();
list.Reverse(list.head);
System.out.println("反转后链表序列为:");
list.printList();
}
}
程序输出结果如下:
反转前链表序列为:
1
2
3
4
5
反转后链表序列为:
5
4
3
2
1