两种方法
1、直接倒置
2、利用栈来倒置
一、直接倒置
先看我画的一个图和大概想法
代码部分
public static void reverse(ListNode head)
{
ListNode p = null;
ListNode temp = null;
//先将原链表的第一个节点的next置为null 链表倒置后 原链表的第一个节点将变为倒置后的最后一个节点
p = head.next; //p指当前正在处理的结点
temp = p.next; //temp指向尚未被处理的第一个节点
p.next = null; //将原第一个节点的next置为null
head.next = p; //插到单链表表头后面
//处理剩下的节点
p = temp;
while(p!=null)
{
temp = p.next;
p.next = head.next;
head.next = p;
p = temp;
}
//输出链表
p = head.next;
while(p!=null)
{
System.out.println(p.data);
p = p.next;
}
}
二、利用栈来实现单链表的倒置
想法很简单,首先遍历链表,然后将每个节点放入栈中。然后再遍历栈 就可以实现单链表的倒置。这个就直接上代码了
//利用栈实现单链表的倒置
public static void reverse1(ListNode head)
{
Stack<ListNode> stack = new Stack<>();
ListNode p = head.next;
//将链表的每个节点入栈
while(p!=null)
{
stack.add(p);
p = p.next;
}
//节点出栈
p = head;
while(!stack.empty())
{
p.next = stack.pop();
p = p.next;
}
//特别要注意 一定要置最后一个节点的next为null
p.next = null;
//输出链表
p = head.next;
while(p!=null)
{
System.out.println(p.data);
p = p.next;
}
}
测试样例:
public static void main(String[] args) {
ListNode head = new ListNode(0);
ListNode p = head;
int[] a = {1,2,3,4,5};
for(int i = 0;i<a.length;i++)
{
p.next = new ListNode(a[i]);
p = p.next;
}
p = head.next;
while(p!=null)
{
System.out.println(p.data);
p = p.next;
}
System.out.println("------");
reverse(head);
System.out.println("------");
reverse1(head);
}