剑指offer 面试题16 反转链表
反转链表
题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:
struct ListNode { int m_nKey; ListNode *m_pNext; };
分析
1.反转过程中,应该保存当前反转结点后的那个结点的地址,返回链表断链。如图
代码
import java.util.ArrayList; public class OperateList { public static void main(String[] args) { ListNode root = new ListNode(1); ListNode temp = root; // 初始化链表 for (int i = 2; i < 4; i++) { temp.next = new ListNode(i); temp = temp.next; } temp = root; System.out.println("======反转之前的状态========="); while (temp != null) { System.out.println(temp.val); temp = temp.next; } root = new OperateList().printListFromTailToHead(root); System.out.println("=======反转之后的状态========="); while (root != null) { System.out.println(root.val); root = root.next; } } /** * 输入参数为链表头结点,作用为:反转该链表,并返回反转后的链表的头结点 * @param listNode * @return */ public ListNode printListFromTailToHead(ListNode listNode) {
if (listNode == null)
return null;
ListNode ln1 = listNode;//记录当前访问结点的前一个结点的应用 ListNode ln2 = listNode.next; //记录当前访问结点 ln1.next = null; //记录当前访问结点的后面那个结点,用于保存它的引用,防止反转过程中“断链”。 ListNode temp = null; while (ln2 != null) { temp = ln2.next; ln2.next = ln1; ln1 = ln2; ln2 = temp; } return ln1; } } class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }
代码为小弟的思路,如果各位路过的大神有更好的思路,请在评论中告知小弟,非常感谢!
加油