题解 | #反转链表#

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

三种方法:
public class Solution {
	//方法一:尾插法构建单链表
	//head参数就是头指针,指向第一个数据节点
	public ListNode ReverseList1(ListNode head) {
		if (head == null){//空链表
			return null;
		}
		if (head.next==null) {//只有一个数据节点
			return head;//反转后仍然是它自己
		}
		ListNode current = head;//current指针指向head
		ListNode tmp = null;//用来指向current的后一个节点
		ListNode pre = null;//用来指向current的前一个节点
		while (current != null) {
			tmp = current.next;
			current.next = pre;
			pre = current;
			current = tmp;
		}
		return pre;
	}
	
	//方法二:头插法构建单链表
	//遍历链表中的每一个节点,然后将每个节点都插在新的头节点(newHead)的后面
	//结束后,再将newHead.next返回【这里一定是返回newHead.next,因为返回的是新链表的第一个节点代表的单链表】
	public ListNode ReverseList2(ListNode head) {
		if (head == null){//空链表
			return null;
		}
		if (head.next==null) {//只有一个数据节点
			return head;//反转后仍然是它自己
		}
		
		ListNode current=head;
		ListNode temp = null;//temp指向current的后一个节点
		ListNode newHead=new ListNode(0);//新的头节点,用来辅助头插法的节点插入操作
		while (current!=null) {
			temp=current.next;
			//将当前节点current摘下来,插入到新的头节点的后面【头插法核心代码】
			current.next=newHead.next;
			newHead.next=current;
			
			//然后current和temp都后移一步
			current=temp;//current指向temp
		}
		return newHead.next;//这里一定是返回newHead.next,即返回新链表的第一个节点代表的单链表
	}
	
	//方法三:用栈的先进后出
	public ListNode ReverseList3(ListNode head) {
	
		Stack<ListNode> stack=new Stack<>();
		
		//遍历单链表,将节点挨个入栈
		ListNode temp=head;
		while (temp.next!=null) {
			stack.push(temp);
			temp=temp.next;//temp后移
		}
		stack.push(temp);
		//入栈结束

		ListNode newHead=new ListNode(0);//新链表的辅助头节点
		ListNode aid=newHead;//辅助指针
		//然后栈中的节点挨个出栈
		while(stack.size()>0){
			aid.next=stack.pop();//出栈节点挂在aid的后面
			aid=aid.next;//后移
		}
		return newHead.next;//返回newHead.next即可,不要返回newHead【因为不需要头节点,只需要返回第一个数据节点代表的单链表即可】
	}
}


全部评论

相关推荐

10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务