单向链表反转思路

166 阅读1分钟

今天讲一下单向链表反转的思路

首先定义一个链表的节点Node

/** * 节点 */classNode{intv; Node next;Node(intx) { v = x;next =null; }}

思路是把链表的下一个节点pCur插入到头结点tempNode的下一个节点进行反转

比如,现在有1->2->3->4->5,这5个节点

反转过程如下:

headNode->2->1->3->4->5headNode->3->2->1->4->5headNode->4>-3->2->1->5headNode->5->4->3->2->1

初始状态如下

![](https://upload-images.jianshu.io/upload_images/24533109-b3c727608100e8c0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

先整理下伪代码思路:

pCur是需要反转的节点

prev是连接下一次需要反转的节点

更改头结点dummy的指向

pCur更改为下一次需要反转的节点

![](https://upload-images.jianshu.io/upload_images/24533109-c7f436fa3d140b70?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后附上代码:

public Node reverse(Node head) {

// 这里申明一个临时节点 作为头结点(0,1,2,3,4,5)

Node tempNode = new Node(0);

// 将临时节点和链表进行连接

tempNode.next = head;

// 下一次需要反转的节点

Node pRev = tempNode.next;

// 反转的节点

Node pCur = pRev.next;

// 判断条件:需要反转的节点不为空就代表不是最后一个节点

while (pCur != null){

// 当前节点next 指向 下个节点的next(1.next = 2.next = 3)

pRev.next = pCur.next;

// 下一个节点的next 指向 临时节点next(2.next = 0.next = 1)

pCur.next = tempNode.next;

// 更改头结点指向(0.next = 2)

tempNode.next = pCur;

// 更改下一个节点指向(3)

pCur = pRev.next;

}

//取出临时节点的下一个节点,就是反转后的链表

return tempNode.next;

}