今天讲一下单向链表反转的思路
首先定义一个链表的节点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
初始状态如下
先整理下伪代码思路:
pCur是需要反转的节点
prev是连接下一次需要反转的节点
更改头结点dummy的指向
pCur更改为下一次需要反转的节点
最后附上代码:
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;
}