反转链表
/* 剑指offer24 反转链表
* 题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
* 解题思路:
* 1.遍历链表,逐个结点入栈,栈中结点出栈重新组装链表
* 2.声明两个指针,p指向null(头结点的前一个结点)q指向头结点
* 遍历链表同时移动pq指针,声明temp指向q的后继,q的后继指向p,p指向q
* 3.创建伪头结点,遍历链表顺序将各结点插在头结点之后
* 测试用例:防空串、只有一个结点的串
* */
public class FanZhuanLianBiao {
public static void main(String[] args) {
ListNode head = new ListNode(4);
ListNode p1 = new ListNode(5);
ListNode p2 = new ListNode(1);
ListNode p3 = new ListNode(9);
head.next=p1;
p1.next=p2;
p2.next=p3;
p3.next=null;
FanZhuanLianBiao_Solution3 solution = new FanZhuanLianBiao_Solution3();
head = solution.reverseList(head);
ListNode node = head;
while(node!=null) {
System.out.println(node.val);
node = node.next;
}
}
}
class FanZhuanLianBiao_Solution1 {
public ListNode reverseList(ListNode head) {
if(head == null || head.next==null) return head;
Stack<ListNode> stack = new Stack<ListNode>();
ListNode node = head;
while(node!=null) {
stack.add(node);
node = node.next;
}
head = stack.pop();
node = head;
while(stack.size()!=0) {
node.next = stack.pop();
node = node.next;
if(stack.size()==0) node.next=null;
}
return head;
}
}
class FanZhuanLianBiao_Solution2{
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null) return head;
ListNode p = null;
ListNode q = head;
ListNode temp = null;
while(q!=null) {
temp = q;
q = q.next;
temp.next = p;
p=temp;
}
return p;
}
}
class FanZhuanLianBiao_Solution3{
public ListNode reverseList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode newHead = new ListNode(-1);
ListNode p = head;
ListNode temp = null;
while(p != null) {
temp = p;
p=p.next;
temp.next = newHead.next;
newHead.next=temp;
}
return newHead.next;
}
}