单链表的反转

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点

分析:

1.递归反转法

在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向,递归反转发是使用的比较普遍的方法也是容易想到的方法

代码实现:

链表类

public class ReserveLinkedList {
	static class ListNode{
		int value;
		ListNode next;
		public int getValue() {
			return value;
		}
		public void setValue(int value) {
			this.value = value;
		}
		public ListNode getNext() {
			return next;
		}
		public void setNext(ListNode next) {
			this.next = next;
		}
		
		public ListNode(int value,ListNode next) {
			this.value = value;
			this.next= next;
		}
	}
	/**
	 * 递归反转的思想其实很简单,从头结点开始,层层深入直到尾结点才开始反转指针域的指向。
	 * 简单的说就是从尾结点开始,逆向反转各个结点的指针域指向
	 * @param head
	 * @return
	 */
	public static ListNode reservedHead(ListNode head) {
		//为了理解方便,我们这里把head看做前一结点,head.getnext()看成当前结点
		if(head == null || head.getNext() == null) {
			return head;
		}
		
		//递归反转
		ListNode reHead = reservedHead(head.getNext());
		//当前链表的下一节点指向前一结点
		head.getNext().setNext(head);
		//前一结点的下一个结点设为空
		head.setNext(null);
		return reHead;
	}
	public static void main(String[] args) {
		//测试方法和反转后的输出可以自行完成
	}

}

2.遍历反转法

遍历反转法的思想就是从前往后一次转换的各个结点的指针指向,具体做法就是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用

代码实现:

/**
	 * 遍历反转
	 * @param head
	 * @return 反转后链表的头结点
	 */
	public static ListNode reservedHead2(ListNode head) {
		
		if(head == null) {
			return head;
		}
		
		ListNode pre = head;
		
		ListNode cur = head.getNext();
		
		//临时节点,用来保存当前结点的下一结点
		ListNode temp = null;
		
		while(cur != null) {//如果当前结点为null,说明位于尾结点
			temp = cur.getNext();
			if(temp == null){
                            return cur;
                        }
			cur.setNext(pre);//反转操作
			
			//指针往后移动
			pre = cur;
			cur = temp;
			
			
		}
		//反转完成后,讲原链表的头结点head的指针域指向null
		head.setNext(null);
		
		return pre;
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值