两个主要方法。一个是带虚拟节点,另一个是不带虚拟节点。
一、带虚拟节点
遍历待处理链表,将待处理链表的结点依次拼接到虚拟头结点后面。
public static Node? ReverseListWithAnsNode(Node? head)
{
if (head == null)
return null;
//将旧链表的节点一个一个拼接到新链表虚拟表头后面。
Node ansNode = new Node(-1);
Node? cur = head;
Node? temp = null;
while (cur != null)
{
//先把当前节点的下一个节点记录下来,防止把当前节点拼接到新链表后,找不到下一个要拼接的节点
temp = cur.next;
cur.next = ansNode.next;
ansNode.next = cur;
cur = temp;
}
return ansNode.next;
}
二、不带虚拟结点
思路大同小异,区别只不过是直接拼接到新链表的头结点。
public static Node? ReverseListWithoutAnsNode(Node? head)
{
if (head == null)
return null;
//遍历久链表的节点,每个节点当成头结点拼接到新链表
Node? cur = head;
Node? prev = null;
Node? next = null;
while(cur != null)
{
next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}