文章目录
1. 题目
将单链表进行反转。
2. 无头结点的单链表
2.1. 原始单链表
2.2. 反转过程
- 初始化
cur = head;
p = null;
q = null;
- 反转第一个节点;
q = cur.next;
cur.next = p;
p = cur;
cur = q;
- 反转第二个节点
q = cur.next;
cur.next = p;
p = cur;
cur = q;
- 反转第三个节点
q = cur.next;
cur.next = p;
p = cur;
cur = q;
- 反转最后一个节点
q = cur.next;
cur.next = p;
p = cur;
cur = q;
- 算法结束
if(cur == null)
{
return;
}
2.3. 代码
- 单链表节点定义
public class MyLinkedListNode
{
int value; // 值域
MyLinkedListNode next; // 指针域
/**
* 默认构造器
*/
public MyLinkedListNode()
{
this.next = null;
}
/**
* 带值域的构造器
* @param value 指定值域的值
*/
public MyLinkedListNode(int value)
{
this();
this.value = value;
}
}
- 反转单链表
/**
* 反转单链表
* @param head 指向反转后链表的第一个节点的指针
*/
public static void reverseSingleLink(MyLinkedListNode head)
{
// 如果单链表不存在、单链表长度为 1,则直接返回 head
if (head == null || head.next == null)
{
return;
}
// 新链表的头指针
MyLinkedListNode p = null;
// 当前反转的节点指针
MyLinkedListNode cur = head;
// 反转节点的下一个节点指针
MyLinkedListNode q = null;
// 当反转节点不为空,说明还有节点没有反转,则进行反转操作
while (cur != null)
{
q = cur.next;
cur.next = p;
p = cur;
cur = q;
}
head = p;
}
2.4. 结果
2.5. Github
Github:MyLinkedListNode.java
Github:ReverseLinkedList.java
3. 带头结点的单链表
3.1. 初始单链表
3.2. 反转
- 初始化
cur = head.next; // cur 指向待反转的节点
head.next = null; // head 作为反转后链表的头结点,初始时 next 域为空
p = null; // p 指向待反转节点的下一个节点
- 反转第一个节点
p = cur.next;
cur.next = head.next;
head.next = cur;
cur = p;
- 反转第二个节点
p = cur.next;
cur.next = head.next;
head.next = cur;
cur = p;
- 反转第三个节点
p = cur.next;
cur.next = head.next;
head.next = cur;
cur = p;
- 反转最后一个节点
p = cur.next;
cur.next = head.next;
head.next = cur;
cur = p;
- 算法结束
if(cur == null)
{
return;
}
3.3. 代码
- 单链表节点定义
public class MyLinkedListNode
{
int value; // 值域
MyLinkedListNode next; // 指针域
/**
* 默认构造器
*/
public MyLinkedListNode()
{
this.next = null;
}
/**
* 带值域的构造器
* @param value 指定值域的值
*/
public MyLinkedListNode(int value)
{
this();
this.value = value;
}
}
- 反转单链表
public static void reverseLinkedListWithHead(MyLinkedListNode head)
{
// 如果单链表不存在、单链表长度为 0、单链表长度为 1,则直接返回
if (head == null || head.next == null || head.next.next == null)
{
return;
}
// 指向待反转节点的指针
MyLinkedListNode cur = head.next;
// head 作为反转后链表的头结点,初始时它的下一节点为空
head.next = null;
// 指向待反转节点的下一个节点的指针
MyLinkedListNode p = null;
// 头插法 -- 将反转节点插入到头结点与头结点下一个节点之间
while (cur != null)
{
p = cur.next;
cur.next = head.next;
head.next = cur;
cur = p;
}
}
3.4. 结果
3.5. Github
Github:MyLinkedListNode.java
[GitHub:ReverseLinkedListWithHead.java]
(https://github.com/domagic/Algorithms/blob/master/ReverseLinkedListWithHead.java)