-
24 两两交换表中的结点
- 代码随想录 (programmercarl.com)
-
第一印象
- 主要是处理两两交换的节点以及交换后结点和后面结点相连是逻辑(最开始遗漏了交换后结点与前面结点的衔接问题,因此也造成了之后解题错误)
-
讲解观后感
- 以十分详细的图示解析了指针的变化过程,并再次体现了虚拟头结点的便利
-
遇到问题

- 错误代码:
-
func reverseList(head *ListNode) *ListNode {
dummy := &ListNode{
Val:0,
Next:head,
}
pre := dummy
cur := head
for cur.Next != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
head.Next = nil
return cur
}
- 判定条件选择错误造成的溢出问题
-
解题代码
-
func reverseList(head *ListNode) *ListNode {
var pre *ListNode
cur := head
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
return pre
}
-
19删除倒数第N个节点
- 代码随想录 (programmercarl.com)
-
第一印象
- 主要是利用快慢两个指针,确定间距,然后同时向后至快指针达到链表末尾。
-
解题代码
-
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummyNode := &ListNode{
Next:head,
}
fast := head
for i:=0;i<n;i++ {
fast = fast.Next
}
slow := dummyNode
for fast!=nil {
fast = fast.Next
slow = slow.Next
}
slow.Next = slow.Next.Next
return dummyNode.Next
}
-
0207链表相交
- 代码随想录 (programmercarl.com)
-
第一印象
- 先各自确定链表的长度,然后将指针分别指向较长链表走过差值的结点和较短链表的头部。同时向后直至末尾或指向同一结点
-
解题代码
-
func getIntersectionNode(headA, headB *ListNode) *ListNode {
sizeA :=0
sizeB :=0
A := headA
B := headB
for A!=nil {
sizeA++
A = A.Next
}
for B!=nil {
sizeB++
B = B.Next
}
if sizeA > sizeB {
diff := sizeA - sizeB
for i:=0;i<diff;i++ {
headA = headA.Next
}
for headA!=nil {
if headA==headB {
return headA
}
headA = headA.Next
headB = headB.Next
}
return nil
} else {
dif := sizeB - sizeA
for i:=0;i<dif;i++ {
headB = headB.Next
}
for headB!=nil {
if headA==headB {
return headB
}
headA = headA.Next
headB = headB.Next
}
return nil
}
}
-
142环形链表
- 代码随想录 (programmercarl.com)
-
第一印象
- 主要是利用快慢指针寻找相遇点。然后再通过模型关系找到环形进入点。
-
解题代码
-
func detectCycle(head *ListNode) *ListNode {
slow := head
fast := head
for slow!=nil&&fast!=nil&&fast.Next!=nil {
slow = slow.Next
fast = fast.Next.Next
if fast == slow {
for head!=slow {
head = head.Next
slow = slow.Next
}
return head
}
}
return nil
}