反转链表

11 篇文章 0 订阅
9 篇文章 0 订阅

    牛客网AC地址:http://www.nowcoder.com/books/coding-interviews/75e878df47f24fdc9dc3e400ec6058ca?rp=1

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

    链表的节点定义如下:

public class ListNode {
	int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
 

    思路:
    需要调整链表中指针的方向,试想,把指针指到它的前面的节点的时候,原来指针指向的节点不能丢掉,所以需要将这个节点(当前遍历的下一个节点)保存下来;
    再想,当遍历一个节点并且变换了指针的方向的时候,到遍历到下一个节点的时候,该指向哪一个节点了呢?所以前一个遍历的节点当前这个节点本身也需要保存下来。
    最后,当遍历到尾节点的时候,即遍历到的当前节点的next为null,此时就是到了反转链表的头结点了。

    AC代码:

public class Solution {
	public ListNode ReverseList(ListNode head) {
		ListNode reversedHead = null;
		ListNode nodeNow = head;  // 当前遍历的节点
		ListNode prev = null;   // 前一个节点
		while (nodeNow != null) {
			ListNode next = nodeNow.next;  // 下一个节点
			if (next == null) {  // 遍历到最后一个节点了
				reversedHead = nodeNow;
			}
			nodeNow.next = prev;
			prev = nodeNow;  // 下一次遍历的时候prev和nodeNow都变化了
			nodeNow = next;
		}
		return reversedHead;
	}
}

    测试代码:
public class Main {
	public static void main(String[] args) {
		ListNode list = null;

		ListNode node_1 = new ListNode(1);
		ListNode node_2 = new ListNode(3);
		ListNode node_3 = new ListNode(5);
		list = node_1;
		list.next = node_2;
		list.next.next = node_3;

		Solution testSolution = new Solution();
		ListNode reverseList = testSolution.ReverseList(list);
		Main.printList(reverseList);
	}

	public static void printList(ListNode list) {
		while (list != null) {
			System.out.print(list.val);
			list = list.next;
		}
		System.out.println();
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值