反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解题思路:

第一种方法是用栈,从头开始遍历整个链表,把链表节点的值放进栈内,然后后进先出,依次把栈顶元素取出,重新存入原链表,实现倒序输出

class ListNode {//链表类
	int val;
	ListNode next;//下一个节点
	ListNode(int x) {//构造函数的初始化
		val = x;
	}
}

	public static ListNode reverseList(ListNode head) {
//		System.out.println(head.val);
		Stack<Integer> a = new Stack<Integer>();
		ListNode current=head;//current指向链表的头节点
		while(current != null){
			a.push(current.val);
			current=current.next;
		}
		//栈a里面是反转后的链表,需要把这个栈内的元素放入到原链表中,形成一个新的链表中
//		System.out.println(head.val);//此时链表仍然是原链表
		current=head;//指针从head开始往后移动
		while(!a.isEmpty()){
			current.val=a.peek();//把当前栈顶元素的值,赋给当前节点
			current = current.next;//指针后移
			a.pop();
		}
		return head;
	}

另一种解法:通过三个指针,直接对链表进行操作,这种方法比较简便,而且节省时间

	public static ListNode reverseList(ListNode head) {
		//如果链表为空或者只有一个元素,直接返回头元素即可
		if(head == null || head.next == null) {
            return head;
        }
        //使用三个节指针
		ListNode current = head;//一个指针为当前节点
		ListNode newhead = null;//另外一个节点则指向新链表表头从而保存结果
		ListNode next = null;//一个指针指向当前节点的下一个节点
		//指向当前节点的指针依次右移,每次分割出来的新节点指向前面分割出的节点,头节点每次右移
		while(current!=null){
			//先把next节点保存起来
			next = current.next;
			//然后切断链表,保存原头节点
			current.next = newhead;
			//把原头节点置为新的表头
			newhead = current;
			//指针右移
			current = next;
		}
		return newhead;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值