Num6-反转链表
一、题目描述
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
1 —> 2 ----> 3 ---->5 ---->7 ----> null
转化后
7 ----> 5 ----> 3 —> 2—> 1----> null
二、分析题目
1. 链表 需要反转,即倒序,并且返回的是头节点
2. 特殊值注意 链表为空的情况
三、方法
1.借用栈(先进后出)
因为是倒序操作,首先先想到的是:使用栈。栈的特点就是先进后出,所以只要先从头到尾的遍历原链表,并且将之存入栈中,遍历结束之后在进行出栈操作即可。
伪代码:
1. 创建栈
2. 从头到尾遍历原链表
3. 讲非空结点存入栈中
4. 将栈中元素出栈
代码如下:
//反转链表
public static ListNode PrintReverseLinklist(LinkList L){
Stack<ListNode> stack = new Stack<ListNode>();
if (L==null)
throw new IllegalArgumentException("链表为空");
ListNode p;
ListNode tail = null;
p = L.head;
//存栈
while (p != null) {
stack.push(p);
p = p.next;
}
L.head = null;
//尾插法
while (!stack.isEmpty()){
p = stack.pop();
p.next = null;
if (L.head == null){
L.head = p;
tail = p;
}
else{
tail.next = p;
tail = p;
}
}
return L.head;
}
创建链表类
public class LinkList {
public ListNode head = null;
//定义节点类型
public void addNode(int d){
ListNode newnode = new ListNode(d);
if(head==null){
head = newnode;
return;
}
ListNode temp = head;
while(temp.next != null){
temp = temp.next;
}
temp.next = newnode;
}
public void traverse(LinkList head){
if (head == null)
return;
ListNode p = head.head;
while (p != null) {
System.out.print(p.data + " ");
p = p.next;
}
}
}
定义节点类
public class ListNode {
public int data;
public ListNode next = null;
ListNode(int data){
this.data = data;
}
public ListNode(){}
}
衍生
题目比较简单, 利用栈的特点,相似类型的题目:逆序输出二叉树的层序遍历