【剑指offer】刷题记录-反转链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

思路:我们要正确反转一个链表,就需要调整链表指针的方向。

                               

如图所示,要调整h,i,j之间的指针方向,现在假设h以前的都已经调整好了。那么下一步,我们就要把i指向h,那么这样就会导致i到j之间的指针断裂,不能遍历到j。因此在调整结点i的指针之前,我们除了要知道i结点,还需要i之前的h结点,要把结点i的next指针指向h结点,并且为了防止链表断开,我们事先还要保存i的下一个结点j。那么我们就要定义3个指针,分别指向当前遍历到的结点、它的前一个结点以及后一个结点。

// 反转链表
public class Solution {
	class ListNode {
		int val;
		ListNode next = null;

		ListNode(int x) {
			val = x;
		}
	}

	public ListNode ReverseList(ListNode head) {
		if (head == null) {
			return null;
		}
		// 定义反转后的结点,也就是当前结点的后一个结点
		ListNode pReverseHead = null;
		// 定义当前结点
		ListNode pNode = head;
		// 定义当前结点的前一个结点
		ListNode pPreNode = null;
		while (pNode != null) {
			ListNode pNext = pNode.next;
			if (pNext == null) {
				pReverseHead = pNode;
			}
			// 调整指针指向前一个结点
			pNode.next = pPreNode;
			
			pPreNode = pNode;
			pNode = pNext;
		}
		return pReverseHead;
	}
}

猜你喜欢

转载自blog.csdn.net/Littlecome/article/details/82108409
今日推荐