倒置链表
- 创建一个新的链表
- 遍历原来的链表,找到最后一个节点(
最后.next==null
),
- 然后断开最后一个节点与原来的链表的连接(
倒数第二.next==null
),
- 接着把最后一个节点,放到新链表的尾部。
java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
public static Node invertLink(Node head) { Node newHead = null; Node newTail = null; Node secondToLast = null; Node last = null; while (head.next != null) { secondToLast = findSecondToLastNode(head); last = secondToLast.next; secondToLast.next = null;
if (newHead == null) { newHead = last; newTail = last; } else { newTail.next = last; newTail = newTail.next; } } last=null; secondToLast=null; newTail.next = head; newTail = newTail.next; head = null; return newHead; }
private static Node findSecondToLastNode(Node head) { Node p = head; while (p.next.next != null) { p = p.next; } return p; }
|
链表倒置代码执行示意图
原来的链表
创建新链表的头指针和尾指针
在旧链表中查找倒数第二个节点,并通过倒数第2个节点得到倒数第1个节点
断开原来链表中尾节点
原来链表中的尾节点作为新链表的头节点以及尾节点
再次查找出旧链表的倒数第二个节点
断开旧链表的最后一个节点
摘下的节点连接到新链表的尾部
新插入的节点作为新链表的尾节点
查找旧链表中倒数第二个节点
10:摘下最后一个节点
11:摘下的节点连接到新链表的尾部
12:新节点作为尾节点
13:查找链表中倒数第2个节点
14:摘下旧链表中的最后一个节点
15:新节点连接到新链表的尾部
16:新节点作为新链表的尾节点
17:倒数第1,倒数第2指针置空
18:旧链表的头节点连接到新链表的尾部
19:设置新插入的节点为尾节点,然后断开旧链表的头指针与该节点的连接。
20:得到反转之后的新链表