反转链表

反转链表

/*	剑指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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值