已知 head 是指向一个带头结点的单链表的头指针,p 指向该链表的任一 结点。试写一算法,将 p 所指向的结点与其后继结点位置交换。

已知 head 是指向一个带头结点的单链表的头指针,p 指向该链表的任一 结点。试写一算法,将 p 所指向的结点与其后继结点位置交换。

node *q = head;
node *k = p->next;
while (q->next != p) q = q->next;
q->next = k;
node *kn=k->next;
k->next = p;
p->next = kn;

【以下回答由 GPT 生成】

解决该问题的思路如下:

  1. 首先判断输入的参数是否有效,如果p为空或者p的next为空,则无法进行位置交换,直接返回头指针head。

  2. 我们需要找到p节点的前驱节点pre,可以从头结点开始遍历链表,直到找到p节点的前驱节点为止。

  3. 判断pre的next节点是否为空,如果为空则无法进行位置交换,直接返回头指针head。

  4. 判断p的next节点是否为空,如果为空则无法进行位置交换,直接返回头指针head。

  5. 将pre的next节点指向p的next节点,此时p节点已经被从链表中移除。

  6. 将p节点的next节点指向pre的next节点的next节点,即p节点的后继节点。

  7. 将pre的next节点的next节点指向p节点,即将p节点插入到pre的后面成为新的后继节点。

  8. 返回头指针head。

下面是使用Python语言实现上述算法的代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def swapNodes(head: ListNode, p: ListNode) -> ListNode:
    # 判断p是否为空或者p的next是否为空
    if p is None or p.next is None:
        return head

    # 找到p节点的前驱节点pre
    pre = head
    while pre.next != p:
        pre = pre.next

    # 判断pre的next是否为空
    if pre.next is None:
        return head

    # 交换节点位置
    pre.next = p.next
    p.next = pre.next.next
    pre.next.next = p

    return head

希望以上解答对您有帮助!如果还有任何疑问,请随时追问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^